我正在使用Java编写一个多线程程序。我已经写了以下代码:
exec.execute(p) // where p is a runnable task working on an array
print array
exec.shutdown
我面临的问题是,数组打印出了正确的输出,但是随后出现了被拒绝的执行异常错误。 我不明白为什么当线程处理并给出正确输出后,为什么会出现这个错误...
我正在使用Java编写一个多线程程序。我已经写了以下代码:
exec.execute(p) // where p is a runnable task working on an array
print array
exec.shutdown
我认为你关闭了执行器得太早。这是一个例子,我认为你应该这样工作。
public class Main {
public static void main(String[] args) throws Exception {
// the array to modify
final int[] array = new int[1000];
// start the executor (that modifies the array)
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 1000; i++) {
final int c = i;
executor.execute(new Runnable() {
@Override
public void run() {
array[c] = c;
}
});
}
// wait for all tasks to quit
executor.shutdown();
while (!executor.awaitTermination(10, TimeUnit.SECONDS));
// print the array
System.out.println(Arrays.toString(array));
}
}
还要注意,同时在同一个数组上工作可能会导致不一致性 - 你必须非常确定你没有对依赖于该数组的数组进行操作。
shutdown()
,您仍然会提交新任务。因此使用executor.awaitTermination()
也无法解决此问题。if (!executor.isShutdown())
{
executor.execute(new Runnable() {
@Override
public void run() {
array[c] = c;
}
});
}
我曾经在运行时shutdown hook中关闭创建的执行器(executors)
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if(!eExecutor.isShutdown()) {
eExecutor.shutdown();
// await termination code
}
}
});
另一个选项是在提交给执行器时获取未来,然后通过调用get在未来上阻塞
Executor
实现呢? - Carl Smotricz