如何获得RejectedExecutionException异常

4

2
关闭执行器,然后提交新任务。 - jtahlborn
5
抛出一个RejectedExecutionException异常。 - Geeky Guy
LOL!!! 经典 @Renan。 - Gray
3个回答

5
有人能给我提供一个获取RejectedExecutionException的例子吗?最好是一个真实的例子。
当然可以。以下代码将2个任务提交到只有1个线程运行的线程池中。它使用了一个SynchronousQueue,这意味着没有任务会被存储在任务队列中。
由于每个任务需要一段时间来运行,第二个execute方法填满了队列,并抛出了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;
        }
    }
}

这是有意设计的,因为队列已满且所有线程都在忙碌。如果您想避免这个问题,您应该创建一个更大的队列,在所有工作线程都忙碌时存储更多的任务,增加处理任务的线程数量(尽管只能增加到一定程度),或者阻塞提交任务给线程池的代码。参见:如何实现阻塞线程池执行器?

1
你能用言语描述一下这会引起什么以及为什么吗?这将作为未来用户的参考。 - nanofarad
你如何避免这个错误?是通过实施速率限制器吗? - Jay Modi
1
@JayModi 请参考:https://dev59.com/HaLia4cB1Zd3GeqPn74c#44658960 - Gray

4
在调用shutdown()方法之后向执行器发送任务将会抛出该异常。此外,如果执行器使用有界阻塞队列且队列已满,则提交任务不会阻塞,而是会立即抛出异常。

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");
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接