2017-04-07 67 views
1

我的應用程序有自己的線程池(myThreadPool),我正在分配它的一個線程(Producer)來通過java stream API讀取文件。但是在運行時,流在某處丟失,永遠不會達到打印方法。但是當我在單線程環境中運行流時,它可以工作。是否發生這種情況是因爲java流Api在其底下使用了自己的線程池,或者這在概念上是錯誤的?在已有的多線程環境中使用Java Stream API

public class Processor { 

    public void process() { 
    ExecutorService myThreadPool = Executors.newFixedThreadPool(3); 
    myThreadPool.execute(new Producer()); 
    } 

    private class Producer implements Runnable{ 
    @Override 
    public void run() { 
     try (Stream<String> lines = Files.lines(Paths.get("Path"))) { 
      System.out.println(lines.count()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
} 
+2

我看不出有任何理由爲什麼這應該不完整。然而,這不是你的實際代碼,也就是說,你沒有說明你如何處理潛在的'IOException'或者'filePath'確實來自哪裏,所以有些東西可能在你沒有的代碼部分出錯所示。 – Holger

+0

是的,我只是張貼需要的部分,但現在更新,以避免混淆;) – Malith

回答

1

我不知道你發生了什麼。但我可以給你一個建議(也許你的程序退出了,生產者沒有終止)。複製這段代碼,看看你的代碼有什麼問題。

public class Processor { 

    public void process() { 
     ExecutorService myThreadPool = Executors.newFixedThreadPool(3); 
     try { 
      myThreadPool.execute(new Producer()); 
      Thread.currentThread().join(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private class Producer implements Runnable { 
     @Override 
     public void run() { 
      try (Stream<String> lines = Files.lines(Paths.get("Path"))) { 
       System.out.println(lines.count()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

OR

public class Processor { 

    public void process() { 
     ExecutorService myThreadPool = Executors.newFixedThreadPool(3); 
     try { 
      myThreadPool.submit(() -> { 
       new Producer().run(); 
       return null; 
      }).get(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    private class Producer implements Runnable { 
     @Override 
     public void run() { 
      try (Stream<String> lines = Files.lines(Paths.get("Path"))) { 
       System.out.println(lines.count()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

我認爲你的猜測是正確的。我只是更換了代碼,它工作。謝謝。所以我想它是在execute()和submit()。get()方法的不同行爲之間的一個判斷。需要理性化一個原因。 – Malith

+0

@Malith他們是一樣的,只有sutmit().get()被阻塞,直到返回值。 –

+0

是的。不知道他們爲什麼表現不同。 – Malith