2015-11-02 64 views
2

我想申请ExecutorService从递归读取路径从url中给出的格式,我有困难试图回忆递归 getRecursive(element.attr(“abs:href”),level);执行器与Jsoup递归

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); 
    } 
} 

回答

3

level变量必须是为了访问它在run()方法final。无论如何,您没有正确使用ExecutorService,您的程序并不局限于5线程,因为您每次调用getRecursive(...)方法时都会创建一个新的ExecutorService

要使用相同的ExecutorService每一个递归,你可以做这样的事情:

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); 
    } 
} 
+0

它的工作原理很好。谢谢泰特斯 –

+1

@马塔姆欢迎你,祝你好运。 – Titus

+0

我想问你如何检查工作是否完成。我试图在main中应用executor.isTerminated()。但仅当您调用shutdown()并且所有子任务已完成时,@Test失败 –