Java ExecutorService从Iterator读取任务

时间:2017-09-19 14:07:18

标签: java parallel-processing executorservice

所有

我正在使用Java ExecutorService并行执行任务。不幸的是,任务清单现已达到数千万。这意味着由于内存限制,提前将任务提交给执行程序服务是不可行的。

我能够生成一个迭代器,可以根据需要动态创建任务,但我不确定如何最好地将它应用于ExecutorService。

我应该创建一个从迭代器中提取下一个任务的任务,还是有更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:1)

快速实验产生了这种作用。它当然应该证明这样做的一种方式。

我创建并运行ServiceFeeder,通过Runnables方法向服务提供execute

ExecutorService service = Executors.newFixedThreadPool(10);

class ServiceFeeder implements Runnable {
    final Iterator<Runnable> i;

    public ServiceFeeder(Iterator<Runnable> i) {
        this.i = i;
    }

    @Override
    public void run() {
        while (i.hasNext()) {
            service.execute(i.next());
        }
    }
}

public void test() throws Exception {
    System.out.println("Hello world!");
    // Demo Iterator<Runnable> - use yours.
    Iterator<Runnable> i = new Iterator<Runnable>() {
        volatile int n = 0;

        @Override
        public boolean hasNext() {
            return n < 100;
        }

        @Override
        public Runnable next() {
            return () -> System.out.println(n++);
        }
    };

    ServiceFeeder feeder = new ServiceFeeder(i);
    Thread feederThread = new Thread(feeder);
    feederThread.start();
    // Wait for the feeder to stop.
    feederThread.join();
    // Wait for the service to stop.
    service.shutdown();
}

这种类型的作品因为它的打印量远远超出我的预期,但这不是一个问题作为演示恕我直言。