線程池執行順序


線程池參數

  • corePoolSize 核心線程數,
  • 最大線程數 maximumPoolSize,
  • 線程沒有執行任務保持多久會終止 keepAliveTime,
  • 時間單位 TimeUnit unit,
  • 阻塞隊列 BlockingQueue workQueue

所有的任務調度都是由execute方法完成。

線程池執行順序

  • 首先檢測線程池運行狀態,如果不是running,則直接拒絕。
  • 如果workCount < corePoolSize,則創建並啟動一個線程線程來執行提交任務。
  • 如果workCount >= corePoolSize,且線程池阻塞隊列未滿,則將任務添加到阻塞隊列中。
  • 如果workCount >= corePoolSize && workCount < maximumPoolSize,並且線程池內的阻塞隊列已滿,則創建並啟動一個線程來執行新提交的任務。
  • 如果workCount >= maximumPoolSize ,並且阻塞隊列已滿,則根據拒絕策略來處理改任務,默認是直接拋出異常
package thread;

import org.junit.Test;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: jeremy
 * @Date: 
 * @desc:
 */
public class ThreadPoolTest {

	int corePoolSize = 3;
	int maximumPoolSize = 5;

	@Test
	public void test() {
		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(5);
		ThreadPoolExecutor executor =new ThreadPoolExecutor(corePoolSize,maximumPoolSize,1L, TimeUnit.MILLISECONDS,workQueue);
		//執行任務,未達到核心線程數之前,創建線程
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//核心線程滿了,阻塞隊列未滿,任務添加到隊列中
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//阻塞隊列滿了,任務未達到最大線程數
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//任務大於最大線程數,執行拒絕策略
		executor.execute(new TestTask());
	}
}

class TestTask implements Runnable{

	@Override
	public void run() {
		try {
			TimeUnit.DAYS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

總結流程

核心線程數 → 添加到隊列 →添加到最大線程數 → 達到最大線程數根據拒絕策略處理(拋異常或者忽略)

測試代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM