2017-04-07 80 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