我有以下代码:
public class ExecFramework implements Runnable {
int i;
public ExecFramework() {
}
public ExecFramework(int i) {
this.i = i;
}
public void run() {
System.out.println(Thread.currentThread().getName() + " " + i);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ExecutorService pool=new ThreadPoolExecutor(2, 10, 5000,TimeUnit.SECONDS, new ArrayBlockingQueue(2));
for (int i = 0; i < 20; i++) {
Runnable obj=new ExecFramework(i);
pool.execute(obj);
}
pool.shutdown();
while(pool.isTerminated()){
System.out.println("ExecutorService is terminated");
}
}
}
我对ThreadPoolExecutor工作方式的了解是否正确:
- 如果NumberOfThreadRunning&lt; CoreNumberOfThreads然后ThreadPoolExecutor创建一个新线程来完成任务。
- 如果NumberOfThreadRunning&gt;然后,CoreNumberOfThreads在BlockingQueue中将此任务排队,但如果队列已满,则仅在以下情况下创建新线程 NumberOfThread&lt; MaxNumberOfThreads。
- 任务完成后,运行该任务的线程可用于其他任务。
醇>
根据第3点。我应该能够使用ThreadPoolExecutor执行20个任务。
为什么输出上面的代码?
pool-1-thread-5 6
pool-1-thread-4 5
pool-1-thread-3 4
pool-1-thread-1 0
pool-1-thread-2 1
pool-1-thread-6 7
pool-1-thread-7 8
pool-1-thread-8 9
pool-1-thread-9 10
pool-1-thread-10 11
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task executionFramework.ExecFramework@232204a1 rejected from java.util.concurrent.ThreadPoolExecutor@4aa298b7[Running, pool size = 10, active threads = 10, queued tasks = 2, completed tasks = 0]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at executionFramework.ExecFramework.main(ExecFramework.java:88)
pool-1-thread-8 2
pool-1-thread-6 3
答案 0 :(得分:0)
文档说:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
在拒绝的任务部分。
在你的情况下,我猜这个:
当Executor对最大线程和工作队列容量使用有限边界时,并且已经饱和
发生。