日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

線程池的拒絕策略

作者:柒畫503 更新時間: 2022-09-22 編程語言

目錄

一、什么是線程池?

二、線程池的好處

三、線程池的執行流程

四、線程池的四種拒絕策略


一、什么是線程池?

線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建線程后自動啟動這些任務。線程池線程都是后臺線程。每個線程都使用默認的堆棧大小,以默認的優先級運行,并處于多線程單元中。如果某個線程在托管代碼中空閑(如正在等待某個事件),則線程池將插入另一個輔助線程來使所有處理器保持繁忙。如果所有線程池線程都始終保持繁忙,但隊列中包含掛起的工作,則線程池將在一段時間后創建另一個輔助線程但線程的數目永遠不會超過最大值。超過最大值的線程可以排隊,但他們要等到其他線程完成后才啟動。線程池中的線程由系統管理,程序員不需要費力于線程管理,可以集中精力處理應用程序任務。

二、線程池的好處

  1. 提高響應速度;
  2. 降低資源消耗,不用頻繁的創建和銷毀線程;
  3. 提高線程的可管理性。

三、線程池的執行流程

  1. 每過來一個任務會啟動一個核心線程去執行

  2. 當核心線程數用完后,會把新來的任務存入阻塞隊列中;

  3. 阻塞隊列存滿后,會再啟動超過核心線程數量到最大線程數量之間的線程;

  4. 當線程的數量達到最大線程數量,再來任務就啟動拒絕策略。

四、線程池的四種拒絕策略

策略

處理方式

AbortPolicy

直接拋出異常

DiscardPolicy

丟棄當前被拒絕的任務(而不拋出任何異常)

DiscardOldestPolicy

將工作隊列中最老的任務丟棄,然后重新嘗試接納被拒絕的任務

CallerRunsPolicy

在客戶端線程中執行被拒絕的任務
package policy;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
import java.util.concurrent.TimeUnit;

public class Test {
	public static void main(String[] args) {
		Runnable r = new Runnable() {
			@Override
			public void run() {
				//for(;;);
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("--------------------");
			}
		};
		Runnable r1 = new Runnable() {
			@Override
			public void run() {
				System.out.println("aaaaaaaaaaaaa");
			}
		};
		ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 
					2, 
					10, 
					TimeUnit.SECONDS, 
					new ArrayBlockingQueue<Runnable>(1), 
					Executors.defaultThreadFactory(), 
					new AbortPolicy());
					//new DiscardPolicy());
					//new DiscardOldestPolicy());
                    //new CallerRunsPolicy());
		pool.execute(r);
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}//保證線程已經開始執行任務
		//獲取當前線程池中線程的數量
		int size = pool.getPoolSize();
		System.out.println(size);
		pool.execute(r);
		size = pool.getPoolSize();
		System.out.println(size);
		pool.execute(r);
		size = pool.getPoolSize();
		System.out.println(size);
		
		pool.execute(r1);
		size = pool.getPoolSize();
		System.out.println(size);
		
		//關閉線程池
		pool.shutdown();
	}

}

1.AbortPolicy

線程池的默認策略,當線程池中核心線程數量、最大線程數量和阻塞隊列都滿時,才會啟動拒絕策略。AbortPolicy就是直接拋出異常。

?2.DiscardPolicy

Discardpolicy策略會拒絕執行新來的線程,但不拋出異常。

相同的代碼,可以看出DiscardPolicy和AbortPolicy的區別。

?3.DiscardOldestPolicy

DiscardOldestPolicy策略,會丟掉隊伍中最早的任務,來嘗試執行新來的任務。

?通過運行結果我們可以看出,新來的任務被執行了。

4.CallerRunsPolicy

CallerRunsPolicy策略不會像DiscardOldestPolicy一樣去丟掉線程池中的任務,它會在客戶端線程中執行被拒絕的任務。

由此我們可以看出,??CallerRunsPolicy策略下的任務并不會影響線程池中的其他任務。

以上就是線程池常用的四種策略,四種策略效果不同,可以在不同的場景中去設置不同類型的拒絕策略。

原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126442785

欄目分類
最近更新