Как я могу получить RejectedExecutionException


Кто-нибудь может предоставить мне пример получения RejectedExecutionException Возможно, пример из реальной жизни. Заранее спасибо.

3 3

3 ответа:

Любой, кто может предоставить мне пример получения RejectedExecutionException, возможно, реальный пример из жизни.

Конечно. Следующий код отправляет 2 задания в пул потоков, в котором выполняется только 1 поток. Он использует SynchronousQueue, Что означает, что никакие задания не будут храниться в очереди заданий.

Поскольку выполнение каждого задания занимает некоторое время, 2-й 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;
        }
    }
}

Отправка задач исполнителю после вызова shutdown( на нем вызовет это исключение.

Кроме того, если исполнитель использует ограниченную блокирующую очередь, если очередь заполнена, то задача не блокируется, а завершается с ошибкой-быстро, за исключением.

Этот вопрос уже был задан и на него дан ответ. : Что может быть причиной 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");
        }
    }
}