1. 程式人生 > 其它 >tomcat執行緒池與原生執行緒池的比較

tomcat執行緒池與原生執行緒池的比較

jdk提供的執行緒池,當核心執行緒數已滿,但是最大執行緒池數未滿,來一個任務時,會先將任務加入阻塞佇列。佇列滿之後才會建立執行緒來處理任務,這是比較適合cpu密集型任務的,但是像tomcat這種伺服器程式就不太適合這種執行流程了。tomcat需要使用者請求到達時馬上就建立執行緒來處理,而不是加入阻塞佇列

先看看jdk原生執行緒池的執行流程。

 1 public void execute(Runnable command) {
 2         if (command == null)
 3             throw new NullPointerException();
 4
/* 5 * Proceed in 3 steps: 6 * 7 * 1. If fewer than corePoolSize threads are running, try to 8 * start a new thread with the given command as its first 9 * task. The call to addWorker atomically checks runState and 10 * workerCount, and so prevents false alarms that would add
11 * threads when it shouldn't, by returning false. 12 * 13 * 2. If a task can be successfully queued, then we still need 14 * to double-check whether we should have added a thread 15 * (because existing ones died since last checking) or that 16 * the pool shut down since entry into this method. So we
17 * recheck state and if necessary roll back the enqueuing if 18 * stopped, or start a new thread if there are none. 19 * 20 * 3. If we cannot queue task, then we try to add a new 21 * thread. If it fails, we know we are shut down or saturated 22 * and so reject the task. 23 */ 24 int c = ctl.get(); 25 if (workerCountOf(c) < corePoolSize) { 26 if (addWorker(command, true)) 27 return; 28 c = ctl.get(); 29 } 30 if (isRunning(c) && workQueue.offer(command)) { 31 int recheck = ctl.get(); 32 if (! isRunning(recheck) && remove(command)) 33 reject(command); 34 else if (workerCountOf(recheck) == 0) 35 addWorker(null, false); 36 } 37 else if (!addWorker(command, false)) 38 reject(command); 39 }

第二步中workQueue.offer(command)這一步是核心,tomcat也是通過改造這一步來實現核心執行緒數滿時來任務直接建立執行緒的方式的

public boolean offer(Runnable o) {
        if (this.parent == null) {
            return super.offer(o);
        } else if (this.parent.getPoolSize() == this.parent.getMaximumPoolSize()) {
            return super.offer(o);
        } else if (this.parent.getSubmittedCount() <= this.parent.getPoolSize()) {
            return super.offer(o);
        } else {
            return this.parent.getPoolSize() < this.parent.getMaximumPoolSize() ? false : super.offer(o);
        }
    }

 

參考:
原文連結:https://blog.csdn.net/weixin_41751625/article/details/116918956