一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - java線程池工作隊(duì)列飽和策略代碼示例

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

2021-02-19 23:09lixwcqs Java教程

這篇文章主要介紹了java線程池工作隊(duì)列飽和策略代碼示例,涉及線程池的簡(jiǎn)單介紹,工作隊(duì)列飽和策略的分析及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

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

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

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

飽和策略分為:abort 策略, callerruns 策略,discard策略,discardolds策略。

為了更好的理解,我編寫(xiě)一個(gè)小的例子。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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 {
    /**
   * 線程池工作隊(duì)列已滿時(shí),在不同飽和策略下表現(xiàn)
   * @param handler 線程池工作隊(duì)列飽和策略
   */
    public static void policy(rejectedexecutionhandler handler){
        //基本線程2個(gè),最大線程數(shù)為3,工作隊(duì)列容量為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)識(shí)
        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)工作隊(duì)列滿了,不同策略的處理方式為:

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

?
1
policy(new threadpoolexecutor.abortpolicy());

運(yùn)行結(jié)果為:

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

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

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

在主函數(shù)運(yùn)行:

?
1
policy((new threadpoolexecutor.callerrunspolicy()));

運(yùn)行結(jié)果

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

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

?
1
policy(new threadpoolexecutor.discardpolicy());

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

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

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

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

?
1
policy(new threadpoolexecutor.discardoldestpolicy());

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

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

總結(jié)

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

原文鏈接:http://blog.csdn.net/lixwjava/article/details/51813032

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产人成激情视频在线观看 | 操儿媳小说 | 精品一区二区三区色花堂 | 色色色资源站 | 爱福利视频一区二区 | 国产成人综合手机在线播放 | 国产精品对白刺激久久久 | 欧美三级不卡视频 | 久久嫩草影院网站 | 国产无限制自拍 | 国产三级精品久久三级国专区 | www.四虎在线观看 | 青青青久热国产精品视频 | 欧美日韩成人在线视频 | a毛片在线免费观看 | 久久久WWW免费人成精品 | 欧美伊人久久久久久久久影院 | 欧美成人免费观看bbb | 99热久久国产精品这里 | 国内精品视频一区二区三区 | 欧美撒尿屁股嘘嘘撒尿 | 成人免费毛片一区二区三区 | 女女同性做爰xxoo亲吻 | 爸爸的宝贝小说全文在线阅读 | 亚洲社区在线观看 | 4hu影院永久在线播放 | 天天草人人草 | 免费观看的毛片 | 男人女人日皮视频 | 国产91精品露脸国语对白 | 天天射久久 | 摸逼网| 小仙夜晚慰自催眠mp3护士篇 | 亚洲AV无码A片在线观看蜜桃 | 亚洲国产成人精品无码区5566 | 高清在线观看mv的网址免费 | 99久久www免费 | 好男人天堂网 | 秋霞理论在一l级毛片 | 美女被扒开屁股进去网 | 边摸边吃奶边做爽视频免费 |