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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

線程池的拒絕策略

作者:柒畫(huà)503 更新時(shí)間: 2022-09-22 編程語(yǔ)言

目錄

一、什么是線程池?

二、線程池的好處

三、線程池的執(zhí)行流程

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


一、什么是線程池?

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

二、線程池的好處

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

三、線程池的執(zhí)行流程

  1. 每過(guò)來(lái)一個(gè)任務(wù)會(huì)啟動(dòng)一個(gè)核心線程去執(zhí)行

  2. 當(dāng)核心線程數(shù)用完后,會(huì)把新來(lái)的任務(wù)存入阻塞隊(duì)列中;

  3. 阻塞隊(duì)列存滿后,會(huì)再啟動(dòng)超過(guò)核心線程數(shù)量到最大線程數(shù)量之間的線程;

  4. 當(dāng)線程的數(shù)量達(dá)到最大線程數(shù)量,再來(lái)任務(wù)就啟動(dòng)拒絕策略。

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

策略

處理方式

AbortPolicy

直接拋出異常

DiscardPolicy

丟棄當(dāng)前被拒絕的任務(wù)(而不拋出任何異常)

DiscardOldestPolicy

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

CallerRunsPolicy

在客戶端線程中執(zhí)行被拒絕的任務(wù)
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();
		}//保證線程已經(jīng)開(kāi)始執(zhí)行任務(wù)
		//獲取當(dāng)前線程池中線程的數(shù)量
		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);
		
		//關(guān)閉線程池
		pool.shutdown();
	}

}

1.AbortPolicy

線程池的默認(rèn)策略,當(dāng)線程池中核心線程數(shù)量、最大線程數(shù)量和阻塞隊(duì)列都滿時(shí),才會(huì)啟動(dòng)拒絕策略。AbortPolicy就是直接拋出異常。

?2.DiscardPolicy

Discardpolicy策略會(huì)拒絕執(zhí)行新來(lái)的線程,但不拋出異常。

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

?3.DiscardOldestPolicy

DiscardOldestPolicy策略,會(huì)丟掉隊(duì)伍中最早的任務(wù),來(lái)嘗試執(zhí)行新來(lái)的任務(wù)。

?通過(guò)運(yùn)行結(jié)果我們可以看出,新來(lái)的任務(wù)被執(zhí)行了。

4.CallerRunsPolicy

CallerRunsPolicy策略不會(huì)像DiscardOldestPolicy一樣去丟掉線程池中的任務(wù),它會(huì)在客戶端線程中執(zhí)行被拒絕的任務(wù)。

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

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

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

欄目分類
最近更新