在我的finalJSONProdRequest
列表中有500行列表。
我希望Executor服务在多个线程中处理数据列表。为此,我在下面的类中创建了3个线程。
如何确保finalJSONProdRequest
数据分成3个线程?当前,相同的数据分配给每个线程。
public class DummyExecutorService {
private ExecutorService service = Executors.newFixedThreadPool(3);
public void executeAsynchronous(List<String> finalJSONProdRequest) {
DummyExecutor task = new DummyExecutor (finalJSONProdRequest);
service.execute(task);
service.shutdown();
}
}
public class DummyExecutor implements Runnable {
public DummyExecutor (List<String> finalJSONProdRequest) {
super();
this.finalJSONProdRequest = finalJSONProdRequest;
}
@Override
public void run() {
//LOGGER.debug("Inside run() of DummyExecutor ");
}
}
当前,与传递500个项目的列表时,相同的数据将传递给相同的线程,您需要传递具有不同内容的列表才能实现此目的。可能只需要170、170和160并调用三遍。
DummyExecutor task1 = new DummyExecutor (finalJSONProdRequest1);
DummyExecutor task2 = new DummyExecutor (finalJSONProdRequest2);
DummyExecutor task3 = new DummyExecutor (finalJSONProdRequest3);
现在提交这些任务。
您可以将请求作为单个任务单独添加到调度程序。因此,您的DummyExecutor
必须重写为仅接受单个String
而不是List<String>
对象。然后,您可以将各个任务添加到计划程序中:
for (String request: finalJSONProdRequest) {
DummyExecutor task = new DummyExecutor (request);
service.execute(task);
}
您仍然只有三个线程可用于调度程序(由Executors.newFixedThreadPool(3);
定义),但是当一个线程完成其任务时,它将获得下一个DummyExecutor
任务。显然,这会创建许多任务(而不是线程),因此您必须自己决定这种方法是否适合您的应用程序。