Java 使用Threadpool和executor服务进行处理

Java 使用Threadpool和executor服务进行处理,java,multithreading,groovy,threadpool,threadpoolexecutor,Java,Multithreading,Groovy,Threadpool,Threadpoolexecutor,我有一个包含10个元素的数组列表。我启动一个大小为10的线程池,并调用execute,将一个元素传递到每个线程中。每个线程将该元素作为输入进行一些处理,并输出结果。问题是,输出有时只有7个元素的处理结果,有时有8个元素的处理结果,有时有一些重复,有时有9个。我不知道为什么我没有确切的10个元素的处理结果。这是我的代码片段 ExecutorService exeSvc = Executors.newFixedThreadPool(10) for (Object e

我有一个包含10个元素的数组列表。我启动一个大小为10的线程池,并调用execute,将一个元素传递到每个线程中。每个线程将该元素作为输入进行一些处理,并输出结果。问题是,输出有时只有7个元素的处理结果,有时有8个元素的处理结果,有时有一些重复,有时有9个。我不知道为什么我没有确切的10个元素的处理结果。这是我的代码片段

ExecutorService exeSvc = 
                Executors.newFixedThreadPool(10)
for (Object element: arlList)//arlList is the arraylist of 
                                                           size-10
{
   exeSvc.execute({->myRunnable element});
}

我做错了什么?

每个元素的执行时间不一样。因此,在进程结束时,需要关闭线程。你可以用

if ( check_whether_operation_is_done ) {
    Logger.info( "Process shutdown" );
    exeSvc.shutdownNow();
}
棒极了

导入java.util.concurrent.ExecutorService
导入java.util.concurrent.Executors
导入java.util.concurrent.TimeUnit
ExecutorService exeSvc=Executors.newFixedThreadPool(5)
对于(int元素=0;元素
睡眠(567);
println“${Thread.currentThread()}element=$element elementCopy=$elementCopy”;
});
}
println“全部启动”
exeSvc.shutdown()
exeSvc.等待终止(10,时间单位秒)
打印“全部完成”
输出

All Started
Thread[pool-12-thread-1,5,main]  element = 9 elementCopy = 0
Thread[pool-12-thread-2,5,main]  element = 9 elementCopy = 1
Thread[pool-12-thread-3,5,main]  element = 9 elementCopy = 2
Thread[pool-12-thread-4,5,main]  element = 9 elementCopy = 3
Thread[pool-12-thread-5,5,main]  element = 9 elementCopy = 4
Thread[pool-12-thread-1,5,main]  element = 9 elementCopy = 5
Thread[pool-12-thread-2,5,main]  element = 9 elementCopy = 6
Thread[pool-12-thread-3,5,main]  element = 9 elementCopy = 7
Thread[pool-12-thread-4,5,main]  element = 9 elementCopy = 8
All Finished

正如您在我的例子中所看到的那样,
for
循环在线程启动之前完成,并且它们都具有
元素
值9和
元素复制
不同

,这是因为
主线程
执行器服务
完成得更快

要强制
主线程
等待
ExecutorService
完成处理,请使用以下命令:

exeSvc.awaitTermination(5, TimeUnit.SECONDS); //this will 5 second to finish all tasks
exeSvc.shutdown();

如果可能的话,您可以添加输出吗?如果一个线程完成了一个作业,它会立即执行下一个作业,因此有时第一个线程会在最后一个线程创建之前执行两个作业。这就是为什么会有重复的原因。“
exeSvc.execute({->myRunnable element});
”-这不会编译。请为(对象元素:arlist)尝试类似的操作{Runnable worker=new WorkerThread();executor.execute(worker);}executor.shutdown();1.为什么它被标记为
groovy
?2.内部
for
将局部变量声明为
元素
变量的副本,并使用
执行({})中的副本
.3.使用
execSvc.shutdown()&&waittermination()
等待所有执行完成此假设池中的线程是守护进程线程。这并不能回答问题。此外,您应该调用
shutdown()
(而不是
shutdownow()
)在上一个作业提交到池中之后。谢谢!这确实解决了我的问题。我所要做的就是将元素复制到for循环中的局部变量。太棒了!!!