3

任何人都可以为我提供一个获取RejectedExecutionException的示例, 可能是一个现实生活中的示例。提前致谢。

4

3 回答 3

4

在调用它之后将任务发送给执行器shutdown(会抛出这个异常。

此外,如果 executor 使用有界阻塞队列,如果队列已满,则提交任务不会阻塞,但会在异常情况下快速失败。

于 2013-07-24T14:47:24.933 回答
3

任何人都可以为我提供一个获取 RejectedExecutionException 的示例,可能是一个现实生活中的示例。

当然。以下代码将 2 个作业提交到仅运行 1 个线程的线程池中。它使用 aSynchronousQueue这意味着作业队列中不会存储任何作业。

由于每个作业都需要一段时间才能运行,因此第二次执行会填满队列并抛出RejectedExecutionException.

// create a 1 thread pool with no buffer for the runnable jobs
ExecutorService threadPool =
    new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
        new SynchronousQueue<Runnable>());
// submit 2 jobs that take a while to run
/// this job takes the only thread
threadPool.execute(new SleepRunnable());
// this tries to put the job into the queue, throws RejectedExecutionException
threadPool.execute(new SleepRunnable());

public class SleepRunnable implements Runnable {
    public void run() {
        try {
            // this just sleeps for a while which pauses the thread
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            return;
        }
    }
}
于 2013-07-24T14:50:28.410 回答
0

已经提出并回答了这个问题: 什么可能是 RejectedExecutionException 的原因将 任务提交到线程池会给出 RejectedExecutionException

此代码给您错误,因为我们尝试启动任务但执行程序已关闭,您可以参考上面的链接以获取更多说明,答案看起来非常完整:

public class Executorz {

    public static void main(String[] args) {
        Executorz ex = new Executorz();
        ExecutorService es = Executors.newFixedThreadPool(10);

        for (int i = 0; i<100 ; i++){
            System.out.println("Executed");
            es.execute(ex.getNewCountin());

            if (i==20)
                es.shutdown();
        }
    }

    public Countin getNewCountin(){
        return new Countin();
    }

    public class Countin implements Runnable {
        @Override
        public void run() {
            for (double i =0; i<1000000000 ; i++){
            }           
            System.out.println("Done");
        }
    }
}
于 2013-07-24T15:06:26.623 回答