7 java
我正在用java编写一个多线程程序.我写过这样的东西
exec.execute(p) // where p is a runnable task working on an array
print array
exec.shutdown
Run Code Online (Sandbox Code Playgroud)
我面临的问题是数组被打印出来给出正确的输出但是然后被拒绝的执行异常来了我不明白为什么当线程处理并给出正确的输出时为什么会出现错误......
dac*_*cwe 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));
}
}
Run Code Online (Sandbox Code Playgroud)
另请注意,同时处理同一个阵列可能会导致不一致 - 您必须确定您没有对依赖于阵列的阵列进行操作.
小智 6
问题是即使在通话后你仍然在提交新任务shutdown().所以使用executor.awaitTermination()无济于事.
要解决此问题,请在提交任务时检查wheather执行程序是否未关闭.
例:
if (!executor.isShutdown())
{
executor.execute(new Runnable() {
@Override
public void run() {
array[c] = c;
}
});
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你 ...