private void makeKeywordCSV() {
        // multi-threaded processing...
        int processorCount = Runtime.getRuntime().availableProcessors();
        ExecutorService executor = Executors.newFixedThreadPool(processorCount);     
        List<UrlKeywordTask> urlKeywordTasks = new ArrayList<>(processorCount);
        for (List<String> urls : UrlSource.getInstance().getListOfLists(processorCount)) {
            UrlKeywordTask urlKeywordTask = new UrlKeywordTask(urls);
            urlKeywordTasks.add(urlKeywordTask);
        }
        try {
            executor.invokeAll(urlKeywordTasks, 5, TimeUnit.MINUTES);
            List<Runnable> unfinished = executor.shutdownNow();
            if (!unfinished.isEmpty()) {
                throw new InterruptedException();
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex);
        } 
        // single-threaded write out...
        try (
                FileWriter writer = new FileWriter("urlKeywords.csv");
            ) {
            for (String url : UrlSource.getInstance().getList()) {
               Set<String> urlKeywords = urlKeywordMap.get(url);
               System.out.println(url);
               System.out.println(urlKeywords);
               System.out.println();
               writer.append("\"" + url + "\",");
               writer.append(urlKeywords.toString().replace(" ", "").replace("[", "").replace("]", ""));
               writer.append("\n");
            }
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage(), ex);
        }
    }