所有
我正在使用Java ExecutorService并行执行任务。不幸的是,任务清单现已达到数千万。这意味着由于内存限制,提前将任务提交给执行程序服务是不可行的。
我能够生成一个迭代器,可以根据需要动态创建任务,但我不确定如何最好地将它应用于ExecutorService。
我应该创建一个从迭代器中提取下一个任务的任务,还是有更好的方法来执行此操作?
答案 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();
}
这种类型的作品因为它的打印量远远超出我的预期,但这不是一个问题作为演示恕我直言。