简体   繁体   English

了解ThreadPoolExecutor内部工作

[英]Understanding ThreadPoolExecutor internal working

I am having following code: 我有以下代码:

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

}

} }

Is my knowledge for the way ThreadPoolExecutor works correct: 我是否了解ThreadPoolExecutor的工作方式正确:

  1. If NumberOfThreadRunning < CoreNumberOfThreads then ThreadPoolExecutor creates a new thread to complete the task. 如果NumberOfThreadRunning <CoreNumberOfThreads,则ThreadPoolExecutor创建一个新线程来完成任务。
  2. If NumberOfThreadRunning > CoreNumberOfThreads then queue this task in BlockingQueue but if queue is full then create a new Thread only if NumberOfThread < MaxNumberOfThreads. 如果NumberOfThreadRunning> CoreNumberOfThreads然后将该任务在BlockingQueue中排队,但是如果队列已满,则仅在NumberOfThread <MaxNumberOfThreads时创建一个新线程。
  3. Once the task is completed thread running that task is available for other task. 任务完成后,运行该任务的线程可用于其他任务。

According to 3rd point. 根据第三点。 I should be able to execute 20 tasks using ThreadPoolExecutor. 我应该能够使用ThreadPoolExecutor执行20个任务。

Why Output of above code is? 为什么上面的代码输出是?

 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 

The documentation says it: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html 该文档说: https : //docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html

In section Rejected tasks . 在“ 拒绝的任务”部分中。

In your case i would guess this : 在您的情况下,我会猜这:

when the Executor uses finite bounds for both maximum threads and work queue capacity, and is saturated 当执行器对最大线程和工作队列容量都使用有限范围时,并且饱和

happens. 发生。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM