并發(fā)編程(二) —— 線程的并發(fā)工具類

Fork/Join

體現(xiàn)了分而治之,大問題分割為相同的小問題视事,小問題之間無關(guān)聯(lián)。動(dòng)態(tài)規(guī)劃庆揩,分割為相同的小問題俐东,小問題之間是有關(guān)聯(lián)的



工作密鹊搿:因?yàn)閯澐值淖尤蝿?wù)的計(jì)算時(shí)間不一樣,先完成的線程會(huì)去后完成的線程中提取任務(wù)執(zhí)行

public class Main {
    public static void main(String[] args) throws Exception {
        // 創(chuàng)建2000個(gè)隨機(jī)數(shù)組成的數(shù)組:
        long[] array = new long[2000];
        long expectedSum = 0;
        for (int i = 0; i < array.length; i++) {
            array[i] = random();
            expectedSum += array[i];
        }
        System.out.println("Expected sum: " + expectedSum);
        // fork/join:
        ForkJoinTask<Long> task = new SumTask(array, 0, array.length);
        long startTime = System.currentTimeMillis();
        Long result = ForkJoinPool.commonPool().invoke(task);
        long endTime = System.currentTimeMillis();
        System.out.println("Fork/join sum: " + result + " in " + (endTime - startTime) + " ms.");
    }

    static Random random = new Random(0);

    static long random() {
        return random.nextInt(10000);
    }
}

class SumTask extends RecursiveTask<Long> {
    static final int THRESHOLD = 500;
    long[] array;
    int start;
    int end;

    SumTask(long[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }

    @Override
    protected Long compute() {
        if (end - start <= THRESHOLD) {
            // 如果任務(wù)足夠小,直接計(jì)算:
            long sum = 0;
            for (int i = start; i < end; i++) {
                sum += this.array[i];
                // 故意放慢計(jì)算速度:
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                }
            }
            return sum;
        }
        // 任務(wù)太大,一分為二:
        int middle = (end + start) / 2;
        System.out.println(String.format("split %d~%d ==> %d~%d, %d~%d", start, end, start, middle, middle, end));
        SumTask subtask1 = new SumTask(this.array, start, middle);
        SumTask subtask2 = new SumTask(this.array, middle, end);
        invokeAll(subtask1, subtask2);
        Long subresult1 = subtask1.join();
        Long subresult2 = subtask2.join();
        Long result = subresult1 + subresult2;
        System.out.println("result = " + subresult1 + " + " + subresult2 + " ==> " + result);
        return result;
    }
}

ForkJoinPool線程池可以把一個(gè)大任務(wù)分拆成小任務(wù)并行執(zhí)行虏辫,任務(wù)類必須繼承自RecursiveTask或RecursiveAction蚌吸。返回值 Task,無返回值 Action砌庄。

CountDownLatch

image.png
//調(diào)用await()方法的線程會(huì)被掛起羹唠,它會(huì)等待直到count值為0才繼續(xù)執(zhí)行

public void await() throws InterruptedException { };   

//和await()類似,只不過等待一定的時(shí)間后count值還沒變?yōu)?的話就會(huì)繼續(xù)執(zhí)行

public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  

//將count值減1

public void countDown() { };

1.CNT與線程數(shù)不是對(duì)應(yīng)關(guān)系
2.一個(gè)線程在進(jìn)行countdown后可以繼續(xù)運(yùn)行
3.可以在一個(gè)線程中多次扣減
4.await線程可以是多個(gè)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄昆,一起剝皮案震驚了整個(gè)濱河市佩微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萌焰,老刑警劉巖哺眯,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異扒俯,居然都是意外死亡奶卓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門撼玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝杖,“玉大人,你說我怎么就攤上這事互纯∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵留潦,是天一觀的道長(zhǎng)只盹。 經(jīng)常有香客問我,道長(zhǎng)兔院,這世上最難降的妖魔是什么殖卑? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮坊萝,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘。我一直安慰自己十偶,他們只是感情好菩鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惦积,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狮崩,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天蛛勉,我揣著相機(jī)與錄音鹿寻,去河邊找鬼。 笑死诽凌,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣诵,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了窝趣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤训柴,失蹤者是張志新(化名)和其女友劉穎哑舒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幻馁,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洗鸵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仗嗦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膘滨。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖稀拐,靈堂內(nèi)的尸體忽然破棺而出火邓,到底是詐尸還是另有隱情,我是刑警寧澤德撬,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布铲咨,位于F島的核電站,受9級(jí)特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏纤勒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望摇天。 院中可真熱鬧,春花似錦恐仑、人聲如沸泉坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坚冀。三九已至,卻和暖如春鉴逞,著一層夾襖步出監(jiān)牢的瞬間记某,已是汗流浹背司训。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留液南,地道東北人壳猜。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滑凉,于是被迫代替她去往敵國(guó)和親统扳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容