我正在用java编写一个多线程程序。我写过类似的东西
exec.execute(p) // where p is a runnable task working on an array
print array
exec.shutdown
我面临的问题是数组被打印得到正确的输出但是被拒绝的执行异常来了 我不明白为什么当线程处理完毕并给出正确的输出时为什么会出现错误...
答案 0 :(得分:13)
我认为你过早地关闭了执行人。这是我认为你应该工作的一个例子。
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));
}
}
另请注意,同时处理同一个阵列可能会导致不一致 - 您必须确定自己没有对依赖于阵列的阵列进行处理。
答案 1 :(得分:6)
问题是,即使在致电shutdown()
之后,您仍在提交新任务。因此使用executor.awaitTermination()
无济于事。
要解决此问题,请在提交任务时检查天使执行器是否未关闭。
示例:
if (!executor.isShutdown())
{
executor.execute(new Runnable() {
@Override
public void run() {
array[c] = c;
}
});
}
希望它有所帮助...
答案 2 :(得分:2)
我曾经关闭在运行时关闭钩子
中创建的执行器Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if(!eExecutor.isShutdown()) {
eExecutor.shutdown();
// await termination code
}
}
});
答案 3 :(得分:0)
当您提交给执行者,然后通过调用get
阻止将来阻止未来时,还有一个选择