Java线程中的RejectedExecutionException

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)

另请注意,同时处理同一个阵列可能会导致不一致 - 您必须确定您没有对依赖于阵列的阵列进行操作.

  • ExecutorService.shutdown()不等待任务关闭,它只是告诉ExecutorService不再接受任何任务并终止.应该在调用shutdown()之后调用ExecutorService.awaitTermination()来阻塞调用线程,直到任务完成. (3认同)

小智 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)

希望能帮助到你 ...