Saj*_*jad 6 java concurrency multithreading threadpoolexecutor
我List的N项目,我想这分List以连续的方式固定数目之间threads.
顺序我的意思是,我想传递1 to N/4给第一个thread,N/4 + 1 to N/2第二个线程和N/2+1 to N第三个thread,现在一旦所有的threads工作完成了,我想通知主要thread发送一些消息,说明所有处理都已完成.
到目前为止我所做的是我已经实施了 ExecutorService
我做了这样的事
ExecutorService threadPool = Executors.newFixedThreadPool(Number_of_threads);
//List of items List
List <items>itemList = getList();
for (int i = 0 i < Number_of_threads ;i++ ) {
//how to divide list here sequentially and pass it to some processor while will process those items.
Runnable processor = new Processor(Start, End)
executor.execute(process);
}
if(executor.isTerminated()){
logger.info("All threads completed");
}
Run Code Online (Sandbox Code Playgroud)
sta*_*off 15
如果您想要的是让所有线程尽快完成处理并且项目数量不是很大,那么只需将Runnable每个项目发布一个newFixedThreadPool(NUMBER_OF_THREADS):
ExecutorService exec = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
List<Future<?>> futures = new ArrayList<Future<?>>(NUMBER_OF_ITEMS);
for (Item item : getItems()) {
futures.add(exec.submit(new Processor(item)));
}
for (Future<?> f : futures) {
f.get(); // wait for a processor to complete
}
logger.info("all items processed");
Run Code Online (Sandbox Code Playgroud)
如果你真的想给每个线程一个连续的列表部分(但仍然希望它们尽可能快地完成,并且还希望处理每个项目花费大约相同的时间),那么将项目拆分为"均匀"你可以这样,每个线程的最大项目数不同于最小数量不超过一个(例如:14项目,4线程,然后你想要拆分,而[4,4,3,3]不是例如[3,3,3,5]).为此,您的代码将是例如
ExecutorService exec = Executors.newFixedThreadPool(NUMBER_OF_THREADS);
List<Item> items = getItems();
int minItemsPerThread = NUMBER_OF_ITEMS / NUMBER_OF_THREADS;
int maxItemsPerThread = minItemsPerThread + 1;
int threadsWithMaxItems = NUMBER_OF_ITEMS - NUMBER_OF_THREADS * minItemsPerThread;
int start = 0;
List<Future<?>> futures = new ArrayList<Future<?>>(NUMBER_OF_ITEMS);
for (int i = 0; i < NUMBER_OF_THREADS; i++) {
int itemsCount = (i < threadsWithMaxItems ? maxItemsPerThread : minItemsPerThread);
int end = start + itemsCount;
Runnable r = new Processor(items.subList(start, end));
futures.add(exec.submit(r));
start = end;
}
for (Future<?> f : futures) {
f.get();
}
logger.info("all items processed");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6976 次 |
| 最近记录: |