如何在ArrayList上应用Executorservice

问题描述 投票:1回答:2

在我的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 ");
    }
}
java executorservice
2个回答
2
投票

当前,与传递500个项目的列表时,相同的数据将传递给相同的线程,您需要传递具有不同内容的列表才能实现此目的。可能只需要170、170和160并调用三遍。

    DummyExecutor task1 = new DummyExecutor (finalJSONProdRequest1);
    DummyExecutor task2 = new DummyExecutor (finalJSONProdRequest2);
    DummyExecutor task3 = new DummyExecutor (finalJSONProdRequest3);

现在提交这些任务。


0
投票

您可以将请求作为单个任务单独添加到调度程序。因此,您的DummyExecutor必须重写为仅接受单个String而不是List<String>对象。然后,您可以将各个任务添加到计划程序中:

for (String request: finalJSONProdRequest) {
    DummyExecutor task = new DummyExecutor (request);
    service.execute(task);
}

您仍然只有三个线程可用于调度程序(由Executors.newFixedThreadPool(3);定义),但是当一个线程完成其任务时,它将获得下一个DummyExecutor任务。显然,这会创建许多任务(而不是线程),因此您必须自己决定这种方法是否适合您的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.