任何人都可以为我提供一个获取RejectedExecutionException的示例, 可能是一个现实生活中的示例。提前致谢。
问问题
2518 次
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 回答