1. 程式人生 > >canal 代碼閱讀

canal 代碼閱讀

tasks keep 問題 rep repo return live policy lsi

涉及到有邊界隊列,無邊界隊列。poolSize、corePoolSize、maximumPoolSize 三者參數含義

If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full. By setting corePoolSize and maximumPoolSize the same, you create a fixed-size thread pool.

he ThreadPoolExecutor has the following several key behaviors, and your problems can be explained by these behaviors.

When tasks are submitted,

  1. If the thread pool has not reached the core size, it creates new threads.
  2. If the core size has been reached and there is no idle threads, it queues tasks.
  3. If the core size has been reached, there is no idle threads, and the queue becomes full, it creates new threads (until it reaches the max size).
  4. If the max size has been reached, there is no idle threads, and the queue becomes full, the rejection policy kicks in.

In the first example, note that the SynchronousQueue has essentially size of 0. Therefore, the moment you reach the max size (3), the rejection policy kicks in (#4).

問題就是使用SynchronousQueue,超過了maximumPoolSize還是能成功提交任務



public static ThreadPoolExecutor newFixedThreadPool(int nThreads, long keepAliveTime) {
    return new ThreadPoolExecutor(nThreads,
        nThreads,
        keepAliveTime,
        TimeUnit.MILLISECONDS,
        new SynchronousQueue<>(),
        (r, exe) -> {
            if (!exe.isShutdown()) {
                try {
                    exe.getQueue().put(r);
                } catch (InterruptedException e) {
                    // ignore
                }
            }
        });
}

canal 代碼閱讀