Java并發(fā)編程(一)線程的各種創(chuàng)建方式

方法一:繼承Thread類,作為線程對象存在(繼承Thread對象)

public class CreatThreadDemo1 extends Thread{
    /**
     * 構(gòu)造方法: 繼承父類方法的Thread(String name);方法
     * @param name
     */
    public CreatThreadDemo1(String name){
        super(name);
    }

    @Override
    public void run() {
        while (!interrupted()){
            System.out.println(getName()+"線程執(zhí)行了...");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        CreatThreadDemo1 d1 = new CreatThreadDemo1("first");
        CreatThreadDemo1 d2 = new CreatThreadDemo1("second");

        d1.start();
        d2.start();

        d1.interrupt();  //中斷第一個線程
    }
}

常規(guī)方法音比,不多做介紹了,interrupted方法氢惋,是來判斷該線程是否被中斷洞翩。(終止線程不允許用stop方法,該方法不會施放占用的資源焰望。所以我們在設(shè)計程序的時候骚亿,要按照中斷線程的思維去設(shè)計,就像上面的代碼一樣)熊赖。

讓線程等待的方法
  • Thread.sleep(200); //線程休息2ms
  • Object.wait()来屠; //讓線程進(jìn)入等待,直到調(diào)用Object的notify或者notifyAll時震鹉,線程停止休眠

方法二:實(shí)現(xiàn)runnable接口俱笛,作為線程任務(wù)存在

public class CreatThreadDemo2 implements Runnable {
    @Override
    public void run() {
        while (true){
            System.out.println("線程執(zhí)行了...");
        }
    }

    public static void main(String[] args) {
        //將線程任務(wù)傳給線程對象
        Thread thread = new Thread(new CreatThreadDemo2());
        //啟動線程
        thread.start();
    }
}

Runnable 只是來修飾線程所執(zhí)行的任務(wù),它不是一個線程對象传趾。想要啟動Runnable對象嫂粟,必須將它放到一個線程對象里。

方法三:匿名內(nèi)部類創(chuàng)建線程對象

public class CreatThreadDemo3 extends Thread{
    public static void main(String[] args) {
        //創(chuàng)建無參線程對象
        new Thread(){
            @Override
            public void run() {
                System.out.println("線程執(zhí)行了...");
            }
        }.start();
       //創(chuàng)建帶線程任務(wù)的線程對象
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("線程執(zhí)行了...");
            }
        }).start();
        //創(chuàng)建帶線程任務(wù)并且重寫run方法的線程對象
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("runnable run 線程執(zhí)行了...");
            }
        }){
            @Override
            public void run() {
                System.out.println("override run 線程執(zhí)行了...");
            }
        }.start();
    }

}

創(chuàng)建帶線程任務(wù)并且重寫run方法的線程對象中墨缘,為什么只運(yùn)行了Thread的run方法星虹。我們看看Thread類的源碼,
image.png

镊讼,我們可以看到Thread實(shí)現(xiàn)了Runnable接口宽涌,而Runnable接口里有一個run方法。
所以蝶棋,我們最終調(diào)用的重寫的方法應(yīng)該是Thread類的run方法卸亮。而不是Runnable接口的run方法。

方法四:創(chuàng)建帶返回值的線程

public class CreatThreadDemo4 implements Callable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CreatThreadDemo4 demo4 = new CreatThreadDemo4();

        FutureTask<Integer> task = new FutureTask<Integer>(demo4); //FutureTask最終實(shí)現(xiàn)的是runnable接口

        Thread thread = new Thread(task);

        thread.start();

        System.out.println("我可以在這里做點(diǎn)別的業(yè)務(wù)邏輯...因?yàn)镕utureTask是提前完成任務(wù)");
        //拿出線程執(zhí)行的返回值
        Integer result = task.get();
        System.out.println("線程中運(yùn)算的結(jié)果為:"+result);
    }

    //重寫Callable接口的call方法
    @Override
    public Object call() throws Exception {
        int result = 1;
        System.out.println("業(yè)務(wù)邏輯計算中...");
        Thread.sleep(3000);
        return result;
    }
}

Callable接口介紹:

public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

返回指定泛型的call方法玩裙。然后調(diào)用FutureTask對象的get方法得道call方法的返回值兼贸。

方法五:定時器Timer

public class CreatThreadDemo5 {

    public static void main(String[] args) {
        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("定時器線程執(zhí)行了...");
            }
        },0,1000);   //延遲0,周期1s

    }
}

方法六:線程池創(chuàng)建線程

public class CreatThreadDemo6 {
    public static void main(String[] args) {
        //創(chuàng)建一個具有10個線程的線程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        long threadpoolUseTime = System.currentTimeMillis();
        for (int i = 0;i<10;i++){
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"線程執(zhí)行了...");
                }
            });
        }
        long threadpoolUseTime1 = System.currentTimeMillis();
        System.out.println("多線程用時"+(threadpoolUseTime1-threadpoolUseTime));
        //銷毀線程池
        threadPool.shutdown();
        threadpoolUseTime = System.currentTimeMillis();
    }

}

方法七:利用java8新特性 stream 實(shí)現(xiàn)并發(fā)

lambda表達(dá)式不懂的吃溅,可以看看我的java8新特性文章:
java8-lambda:http://www.reibang.com/p/3a08dc78a05f
java8-stream:http://www.reibang.com/p/ea16d6712a00

public class CreatThreadDemo7 {
    public static void main(String[] args) {
        List<Integer> values = Arrays.asList(10,20,30,40);
        //parallel 平行的溶诞,并行的
        int result = values.parallelStream().mapToInt(p -> p*2).sum();
        System.out.println(result);
        //怎么證明它是并發(fā)處理呢
        values.parallelStream().forEach(p-> System.out.println(p));
    }
}

200
40
10
20
30

怎么證明它是并發(fā)處理呢,他們并不是按照順序輸出的 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末决侈,一起剝皮案震驚了整個濱河市螺垢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖枉圃,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件功茴,死亡現(xiàn)場離奇詭異,居然都是意外死亡孽亲,警方通過查閱死者的電腦和手機(jī)坎穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來返劲,“玉大人赁酝,你說我怎么就攤上這事⌒竦龋” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵衡载,是天一觀的道長搔耕。 經(jīng)常有香客問我,道長痰娱,這世上最難降的妖魔是什么弃榨? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮梨睁,結(jié)果婚禮上鲸睛,老公的妹妹穿的比我還像新娘。我一直安慰自己坡贺,他們只是感情好官辈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍坟,像睡著了一般拳亿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愿伴,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天肺魁,我揣著相機(jī)與錄音,去河邊找鬼隔节。 笑死鹅经,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怎诫。 我是一名探鬼主播瘾晃,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幻妓!你這毒婦竟也來了酗捌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胖缤,沒想到半個月后尚镰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哪廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年狗唉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涡真。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡分俯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哆料,到底是詐尸還是另有隱情鹃骂,我是刑警寧澤冬念,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響市咽,放射性物質(zhì)發(fā)生泄漏堰酿。R本人自食惡果不足惜圃泡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一浸颓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壮啊,春花似錦嫉鲸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狸眼,卻和暖如春捻爷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背份企。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工也榄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人司志。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓甜紫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骂远。 傳聞我的和親對象是個殘疾皇子囚霸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)激才,斷路器拓型,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法额嘿,類相關(guān)的語法,內(nèi)部類的語法劣挫,繼承相關(guān)的語法册养,異常的語法,線程的語...
    子非魚_t_閱讀 31,622評論 18 399
  • 題目LINK 題意解釋 這道題是給出了3個值的任意兩個值压固,求剩下的那個球拦。題中給出了公式,所以直接自己反推下公式就好...
    DeamoV閱讀 276評論 0 0
  • (本文參考課本是《HTTP權(quán)威指南》帐我,文中的書寫結(jié)構(gòu)是根據(jù)自己的閱讀理解的個人思路坎炼,如有不懂可以自行參考原書) 第...
    Andrew_bao閱讀 542評論 1 3