如何获得RejectedExecutionException

时间:2013-07-24 14:46:23

标签: java multithreading exception pool

任何人都可以向我提供获取RejectedExecutionException的示例 可能是一个真实的例子。 提前谢谢。

3 个答案:

答案 0 :(得分:3)

在调用shutdown(之后将任务发送给执行程序将引发此异常。

此外,如果执行程序使用有界阻塞队列,如果队列已满,则提交任务将不会阻止,但会因异常而失败。

答案 1 :(得分:2)

  

任何能够向我提供获取RejectedExecutionException的示例的人都可能是一个真实的例子。

不确定。以下代码将2个作业提交到一个只运行1个线程的线程池中。它使用SynchronousQueue,这意味着作业队列中不会存储任何作业。

由于每个作业需要一段时间才能运行,因此第二个执行会填充队列并抛出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;
        }
    }
}

答案 2 :(得分:0)

这个问题已经被问及并回答: What could be the cause of RejectedExecutionException Submitting tasks to a thread-pool gives 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");
        }
    }
}