最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java線程池工作隊列飽和策略代碼示例

 更新時間:2017年11月23日 11:00:22   作者:lixwcqs  
這篇文章主要介紹了java線程池工作隊列飽和策略代碼示例,涉及線程池的簡單介紹,工作隊列飽和策略的分析及代碼示例,具有一定參考價值,需要的朋友可以了解下。

線程池(Thread Pool) 是并行執(zhí)行任務(wù)收集的實用工具。隨著 CPU 引入適合于應(yīng)用程序并行化的多核體系結(jié)構(gòu),線程池的作用正日益顯現(xiàn)。通過 ThreadPoolExecutor類及其他輔助類,Java 5 引入了這一框架,作為新的并發(fā)支持部分。

ThreadPoolExecutor框架靈活且功能強大,它支持特定于用戶的配置并提供了相關(guān)的掛鉤(hook)和飽和策略來處理滿隊列

Java線程池會將提交的任務(wù)先置于工作隊列中,在從工作隊列中獲取(SynchronousQueue直接由生產(chǎn)者提交給工作線程)。那么工作隊列就有兩種實現(xiàn)策略:無界隊列和有界隊列。無界隊列不存在飽和的問題,但是其問題是當(dāng)請求持續(xù)高負(fù)載的話,任務(wù)會無腦的加入工作隊列,那么很可能導(dǎo)致內(nèi)存等資源溢出或者耗盡。而有界隊列不會帶來高負(fù)載導(dǎo)致的內(nèi)存耗盡的問題,但是有引發(fā)工作隊列已滿情況下,新提交的任務(wù)如何管理的難題,這就是線程池工作隊列飽和策略要解決的問題。

飽和策略分為:Abort 策略, CallerRuns 策略,Discard策略,DiscardOlds策略。

為了更好的理解,我編寫一個小的例子。

package concurrency.pool;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class SaturationPolicy {
	/**
   * 線程池工作隊列已滿時,在不同飽和策略下表現(xiàn)
   * @param handler 線程池工作隊列飽和策略
   */
	public static void policy(RejectedExecutionHandler handler){
		//基本線程2個,最大線程數(shù)為3,工作隊列容量為5
		ThreadPoolExecutor exec = new ThreadPoolExecutor(2,3,0l, TimeUnit.MILLISECONDS,new LinkedBlockingDeque<>(5));
		if (handler != null){
			exec.setRejectedExecutionHandler(handler);
			//設(shè)置飽和策略
		}
		for (int i = 0; i < 10; i++) {
			exec.submit(new Task());
			//提交任務(wù)
		}
		exec.shutdown();
	}
	public static void main(String[] args) {
		//    policy(new ThreadPoolExecutor.AbortPolicy());
		//    policy((new ThreadPoolExecutor.CallerRunsPolicy()));
		//    policy(new ThreadPoolExecutor.DiscardPolicy());
		//    policy(new ThreadPoolExecutor.DiscardOldestPolicy());
	}
	//自定義任務(wù)
	static class Task implements Runnable {
		private static int count = 0;
		private int id = 0;
		//任務(wù)標(biāo)識
		public Task() {
			id = ++count;
		}
		@Override
		    public void run() {
			try {
				TimeUnit.SECONDS.sleep(3);
				//休眠3秒
			}
			catch (InterruptedException e) {
				System.err.println("線程被中斷" + e.getMessage());
			}
			System.out.println(" 任務(wù):" + id + "\t 工作線程: "+ Thread.currentThread().getName() + " 執(zhí)行完畢");
		}
	}
}

當(dāng)工作隊列滿了,不同策略的處理方式為:

1.Abort策略:默認(rèn)策略,新任務(wù)提交時直接拋出未檢查的異常RejectedExecutionException,該異常可由調(diào)用者捕獲。
在主函數(shù)中添加如下代碼:

policy(new ThreadPoolExecutor.AbortPolicy()); 

運行結(jié)果為:

程序拋出了RejectedExecutionException,并且一共運行了8個任務(wù)(線程池開始能運行3個任務(wù),工作隊列中存儲5個隊列)。當(dāng)工作隊列滿了的時候,直接拋出了異常,而且JVM一直不退出(我現(xiàn)在也不知道什么原因)。我們可以看到執(zhí)行任務(wù)的線程全是線程池中的線程。

2.CallerRuns策略:為調(diào)節(jié)機制,既不拋棄任務(wù)也不拋出異常,而是將某些任務(wù)回退到調(diào)用者。不會在線程池的線程中執(zhí)行新的任務(wù),而是在調(diào)用exector的線程中運行新的任務(wù)。

在主函數(shù)運行:

policy((new ThreadPoolExecutor.CallerRunsPolicy())); 

運行結(jié)果

所有的任務(wù)都被運行,且有2(10 - 3 -5)個任務(wù)是在main線程中執(zhí)行成功的,8個任務(wù)在線程池中的線程執(zhí)行的。
3.Discard策略:新提交的任務(wù)被拋棄。
在main函數(shù)中運行

policy(new ThreadPoolExecutor.DiscardPolicy()); 

通過上面的結(jié)果可以顯示:沒有異常拋出,后面提交的2個新任務(wù)被拋棄,只處理了前8(3+5)個任務(wù),JVM退出。

4.DiscardOldest策略:隊列的是“隊頭”的任務(wù),然后嘗試提交新的任務(wù)。(不適合工作隊列為優(yōu)先隊列場景)

在main函數(shù)中運行如下方法

policy(new ThreadPoolExecutor.DiscardOldestPolicy()); 

運行結(jié)果:一共運行8個任務(wù),程序結(jié)束,后面添加的任務(wù)9,任務(wù)10被執(zhí)行了,而前面的任務(wù)3,任務(wù)4被丟棄。

總結(jié)

以上就是本文關(guān)于java線程池工作隊列飽和策略代碼示例的全部內(nèi)容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持。

相關(guān)文章

  • 解讀jdk動態(tài)代理為什么必須實現(xiàn)接口

    解讀jdk動態(tài)代理為什么必須實現(xiàn)接口

    這篇文章主要介紹了解讀jdk動態(tài)代理為什么必須實現(xiàn)接口問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Mybatis 入門示例代碼之 Association

    Mybatis 入門示例代碼之 Association

    這篇文章主要介紹了Mybatis 入門示例代碼之 Association,需要的的朋友參考下
    2017-02-02
  • spring使用redis操作key-value的示例代碼

    spring使用redis操作key-value的示例代碼

    這篇文章主要介紹了spring使用redis操作key-value的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 如何利用IDEA快速生成實體類

    如何利用IDEA快速生成實體類

    這篇文章主要介紹了如何利用IDEA快速生成實體類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • SpringBoot整合Gson 整合Fastjson的實例詳解

    SpringBoot整合Gson 整合Fastjson的實例詳解

    這篇文章主要介紹了SpringBoot整合Gson 整合Fastjson的實例詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例

    Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例

    這篇文章主要介紹了Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能,結(jié)合具體實例形式分析了java日期與時間戳類型的表示與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 使用jpa的時候set實體類屬性自動持久化的解決方案

    使用jpa的時候set實體類屬性自動持久化的解決方案

    這篇文章主要介紹了使用jpa的時候set實體類屬性自動持久化的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot簡單的SpringBoot后端實例

    SpringBoot簡單的SpringBoot后端實例

    這篇文章主要介紹了SpringBoot簡單的SpringBoot后端實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java異步判斷線程池所有任務(wù)是否執(zhí)行完成的操作方法

    Java異步判斷線程池所有任務(wù)是否執(zhí)行完成的操作方法

    這篇文章主要介紹了Java異步判斷線程池所有任務(wù)是否執(zhí)行完成的方法,在這個示例中,我使用了傳統(tǒng)的匿名內(nèi)部類來創(chuàng)建Callable任務(wù)(同時也提供了Lambda表達(dá)式的注釋),以便與各種Java版本兼容,需要的朋友可以參考下
    2024-07-07
  • java中public class與class的區(qū)別詳解

    java中public class與class的區(qū)別詳解

    以下是對java中public class與class的區(qū)別進(jìn)行了分析介紹,需要的朋友可以過來參考下
    2013-07-07

最新評論

巴林右旗| 凭祥市| 巍山| 阜南县| 南澳县| 安仁县| 高台县| 南宁市| 额尔古纳市| 德格县| 根河市| 澎湖县| 美姑县| 台山市| 沂南县| 武胜县| 抚松县| 石城县| 昭觉县| 鄂温| 灵川县| 定日县| 米泉市| 龙门县| 都江堰市| 万源市| 平湖市| 棋牌| 沙河市| 贵阳市| 高青县| 红桥区| 普安县| 湖南省| 临洮县| 塔城市| 开封市| 乌恰县| 姚安县| 东丽区| 南靖县|