2015-11-02 62 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失敗 –