Java利用ExecutorService實(shí)現(xiàn)同步執(zhí)行大量線程

自從java1.5以后,官網(wǎng)就推出了Executor這樣一個(gè)類(lèi),這個(gè)類(lèi)定血,可以維護(hù)我們的大量線程在操作臨界資源時(shí)的穩(wěn)定性。

先上一段代碼吧:

TestRunnable.java
public class TestRunnable implements Runnable {
    private String name;

    public TestRunnable(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        while (true) {
            if (Main.Surplus < 0)
                return;
            Main.Surplus--;
            System.out.println(name + "  " + Main.Surplus);
        }
    }
}
main入口
public static void main(String[] args) {

         TestRunnable runnable = new TestRunnable("runnable1");
         TestRunnable runnable2 = new TestRunnable("runnable2");
        
         Thread t1 = new Thread(runnable);
         Thread t2 = new Thread(runnable2);
        
         t1.start();
         t2.start();

    }
result

這樣诞外,我們就看到了澜沟,數(shù)據(jù)肯定是亂了的,當(dāng)然這個(gè)時(shí)候我們可以加上一個(gè)synchronized的關(guān)鍵字峡谊,但是這樣也會(huì)出現(xiàn)點(diǎn)小問(wèn)題的

result2

下面我打算采用一種java內(nèi)置的線程管理的機(jī)制茫虽,來(lái)解決這個(gè)問(wèn)題,解決這個(gè)問(wèn)題的思路大概就是靖苇,我們維護(hù)了一個(gè)線程池席噩,當(dāng)有請(qǐng)求操作的時(shí)候統(tǒng)統(tǒng)進(jìn)入線程池,并且我們只開(kāi)了一個(gè)線程贤壁,可以讓請(qǐng)求順序執(zhí)行悼枢,順序調(diào)用臨界資源,就很安全了脾拆。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {
    public static int Surplus = 10;

    private ExecutorService executor = Executors.newSingleThreadExecutor();

    void addTask(Runnable runnable) {
        executor.execute(runnable);
    }

    <V> V addTask(Callable<V> callable) {
        Future<V> submit = executor.submit(callable);
        try {
            return submit.get();
        } catch (InterruptedException e) {
            System.out.println("InterruptedException" + e.toString());
        } catch (ExecutionException e) {
            System.out.println("ExecutionException" + e.toString());
        }
        return null;
    }

    public void testAddTask(String name) {
        addTask(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    if (Main.Surplus <= 0)
                        return;
                    Main.Surplus--;
                    System.out.println(name + "  " + Main.Surplus);
                }

            }
        });
    }

    public void testAddTask2(String name) {
        int count = addTask(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                for (int i = 0; i < 3; i++) {
                    if (Main.Surplus <= 0)
                        return 0;
                    Main.Surplus--;
                    System.out.println(name + "  " + Main.Surplus);
                }
                return Main.Surplus;
            }
        });

    }

    public void close() {
        executor.shutdown();
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.testAddTask("task1");
        main.testAddTask2("task2");
        main.testAddTask("task3");
        main.testAddTask2("task4");
        main.close();
    }
}

在這里馒索,我們定義了兩種方法莹妒,分別是addTask,具有泛型的addTask绰上,這兩種方法實(shí)現(xiàn)原理都是一樣的旨怠,其中一個(gè)是有回調(diào)的,一個(gè)是沒(méi)有回調(diào)的蜈块,就看項(xiàng)目需求了吧鉴腻。

result3

然后分別調(diào)用這兩個(gè)方法咯,就可以看到結(jié)果是非常有序百揭,且不會(huì)混亂的爽哎。


當(dāng)然啊,系統(tǒng)為我們提供這樣一個(gè)類(lèi)器一,肯定不是為了實(shí)現(xiàn)這么小的一個(gè)功能的课锌,它還有很多功能,我也在進(jìn)一步的學(xué)習(xí)中~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末祈秕,一起剝皮案震驚了整個(gè)濱河市渺贤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌请毛,老刑警劉巖志鞍,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異获印,居然都是意外死亡述雾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)兼丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)玻孟,“玉大人,你說(shuō)我怎么就攤上這事鳍征∈螋幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵艳丛,是天一觀的道長(zhǎng)匣掸。 經(jīng)常有香客問(wèn)我,道長(zhǎng)氮双,這世上最難降的妖魔是什么碰酝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮戴差,結(jié)果婚禮上送爸,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好袭厂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布墨吓。 她就那樣靜靜地躺著,像睡著了一般纹磺。 火紅的嫁衣襯著肌膚如雪帖烘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天橄杨,我揣著相機(jī)與錄音秘症,去河邊找鬼。 笑死讥珍,一個(gè)胖子當(dāng)著我的面吹牛历极,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衷佃,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蹄葱!你這毒婦竟也來(lái)了氏义?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤图云,失蹤者是張志新(化名)和其女友劉穎惯悠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竣况,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡克婶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丹泉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片情萤。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摹恨,靈堂內(nèi)的尸體忽然破棺而出筋岛,到底是詐尸還是另有隱情,我是刑警寧澤晒哄,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布睁宰,位于F島的核電站,受9級(jí)特大地震影響寝凌,放射性物質(zhì)發(fā)生泄漏柒傻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一较木、第九天 我趴在偏房一處隱蔽的房頂上張望红符。 院中可真熱鬧,春花似錦、人聲如沸违孝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雌桑。三九已至喇喉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間校坑,已是汗流浹背拣技。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耍目,地道東北人膏斤。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像邪驮,于是被迫代替她去往敵國(guó)和親莫辨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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

  • 一毅访、多線程 說(shuō)明下線程的狀態(tài) java中的線程一共有 5 種狀態(tài)沮榜。 NEW:這種情況指的是,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,662評(píng)論 0 44
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法喻粹,類(lèi)相關(guān)的語(yǔ)法蟆融,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法守呜,異常的語(yǔ)法型酥,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,596評(píng)論 18 399
  • 下面是我自己收集整理的Java線程相關(guān)的面試題,可以用它來(lái)好好準(zhǔn)備面試查乒。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,753評(píng)論 14 507
  • 不管你是新程序員還是老手弥喉,你一定在面試中遇到過(guò)有關(guān)線程的問(wèn)題。Java語(yǔ)言一個(gè)重要的特點(diǎn)就是內(nèi)置了對(duì)并發(fā)的支持侣颂,讓...
    堯淳閱讀 1,590評(píng)論 0 25
  • 1.高度 你站在10樓 我在1樓 請(qǐng)不要和我談?wù)撨h(yuǎn)方 我不可能看到比你更遠(yuǎn)的地方 你在大學(xué)殿堂攻讀4年 我小學(xué)畢業(yè)...
    沙粒_580f閱讀 235評(píng)論 0 0