javajsoupexecutors

Executors recursive with Jsoup


I want to apply ExecutorService for recursive read path from url in the format given,I had difficulty trying to recall recursive getRecursive(element.attr("abs:href"), level);

public class NewClass {

    static String levels[] = {"div.col-md-9 li a", "div#sidebar ul li a"};

    private void getRecursive(String href,int level) {

        if (level > levels.length - 1) {
            return;
        }

        Document doc;
        try {
            doc = Jsoup.connect(href).get();
            Elements elements = doc.select(levels[level]);

            level++;
            ExecutorService executor = Executors.newFixedThreadPool(5);
            for (final Element element : elements) {
                executor.execute(new Runnable() {

                    @Override
                    public void run() {
                        if (!element.attr("href").isEmpty()) {
                            String links = "";
                            links += element.attr("abs:href") + "\n";
                            System.out.println(links);
                            getRecursive(element.attr("abs:href"), level);
                        }
                    }
                });
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new NewClass().getRecursive("http://www.java2s.com/", 0);
    }
}

Solution

  • The level variable has to be final in order to access it in the run() method. In any case, your not using ExecutorService correctly, your program is not limited to 5 threads because you're creating a new ExecutorService every time you call the getRecursive(...) method.

    To use the same ExecutorService for every recursion, you can do something like this:

    public class NewClass { 
    
        static String levels[] = { "div.col-md-9 li a", "div#sidebar ul li a" };    
        static String links = "";   
    
        private void getRecursive(String href, int level, final ExecutorService executor) { 
    
            if (level > levels.length - 1) {    
                return; 
            }   
    
            Document doc;   
            try {   
                doc = Jsoup.connect(href).get();    
                Elements elements = doc.select(levels[level]);  
                final int flevel = ++level; 
                for (final Element element : elements) {    
                    executor.execute(new Runnable() {   
                        @Override   
                        public void run() { 
                            if (!element.attr("href").isEmpty()) {  
                                links += element.attr("abs:href") + "\n";   
                                System.out.println(links);  
                                getRecursive(element.attr("abs:href"), flevel, executor);   
                            }   
                        }   
                    }); 
                }   
            } catch (IOException e1) {  
                e1.printStackTrace();   
            }   
        }   
    
        public static void main(String[] args) {    
            ExecutorService executor = Executors.newFixedThreadPool(5); 
            new NewClass().getRecursive("http://www.java2s.com/", 0, executor); 
        }   
    }