在已有的多线程环境中使用Java Stream API

时间:2017-04-07 15:20:22

标签: java-8 java-stream

我的应用程序有自己的线程池(myThreadPool),我正在分配一个线程(Producer)来通过java stream API读取文件。但是在运行时流在某处丢失并且永远不会到达打印方法。但是当我在单线程环境中运行流时,它可以工作。是否会发生这种情况,因为java流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();
        }
    }
 }
}

1 个答案:

答案 0 :(得分: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();
            }
        }
    }
}

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