Thread仿滔、Runnable、Callable

1.Thread
/**

  • 繼承Thread類創(chuàng)建線程類
  • (1)定義Thread類的子類犹芹,重寫該類的run方法崎页,該run方法的方法體就代表了線程要完成的任務(wù)。
  • (2)創(chuàng)建Thread子類的實(shí)例腰埂,即創(chuàng)建了線程對(duì)象飒焦。
  • (3)調(diào)用線程對(duì)象的start()方法來啟動(dòng)該線程。
    */

package thread;

public class Thread_Test extends Thread{

private int ticketnum = 10;
//重寫run方法屿笼,run方法的方法體就是現(xiàn)場(chǎng)執(zhí)行體
public void run() {
    for(int i=0; i<20;i++){
        if (this.ticketnum > 0) {
            ticketnum--;
            System.out.println("總共10張,賣掉1張牺荠,剩余" + ticketnum);
        }
    }
}
public static void main(String[] args)
{
    new Thread_Test().start();
    new Thread_Test().start();
    new Thread_Test().start();
    //實(shí)際上是賣掉了30張車票
}

}

輸出:
總共10張,賣掉1張,剩余9
總共10張,賣掉1張驴一,剩余8
總共10張,賣掉1張休雌,剩余7
總共10張,賣掉1張,剩余6
總共10張,賣掉1張肝断,剩余9
總共10張,賣掉1張杈曲,剩余8
總共10張,賣掉1張,剩余7
總共10張,賣掉1張胸懈,剩余6
總共10張,賣掉1張鱼蝉,剩余5
總共10張,賣掉1張,剩余5
總共10張,賣掉1張箫荡,剩余4
總共10張,賣掉1張,剩余9
總共10張,賣掉1張渔隶,剩余3
總共10張,賣掉1張羔挡,剩余2
總共10張,賣掉1張洁奈,剩余1
總共10張,賣掉1張,剩余0
總共10張,賣掉1張绞灼,剩余4
總共10張,賣掉1張利术,剩余3
總共10張,賣掉1張,剩余2
總共10張,賣掉1張低矮,剩余1
總共10張,賣掉1張印叁,剩余0
總共10張,賣掉1張,剩余8
總共10張,賣掉1張军掂,剩余7
總共10張,賣掉1張轮蜕,剩余6
總共10張,賣掉1張,剩余5
總共10張,賣掉1張蝗锥,剩余4
總共10張,賣掉1張跃洛,剩余3
總共10張,賣掉1張,剩余2
總共10張,賣掉1張终议,剩余1
總共10張,賣掉1張汇竭,剩余0

2.Runnable
/**

  • 通過Runnable接口創(chuàng)建線程類
  • (1)定義runnable接口的實(shí)現(xiàn)類,重寫該接口的run()方法穴张,該run()方法的方法體是該線程的線程執(zhí)行體细燎。
  • (2)創(chuàng)建Runnable實(shí)現(xiàn)類的實(shí)例,并依此實(shí)例作為Thread的Runnable target來創(chuàng)建Thread對(duì)象皂甘,
  • 該Thread對(duì)象才是真正的線程對(duì)象玻驻。
  • (3)調(diào)用線程對(duì)象的start()方法來啟動(dòng)該線程。
    */

package thread;

public class Runnable_Test implements Runnable {

private int ticketnum = 10;

public void run() {
    for(int i=0; i<20;i++){
        if (this.ticketnum > 0) {
            ticketnum--;
            System.out.println("總共10張,"+Thread.currentThread().getName()+"賣掉1張叮贩,剩余" + ticketnum);
        }
    }
}

public static void main(String[] args) {
    /*因?yàn)镽unnable_Test是New了一次击狮,使用的是同一個(gè)Runnable_Test,
    可以達(dá)到資源的共享益老。最終只賣出10張車票*/
    Runnable_Test rtt = new Runnable_Test();
    //使用三個(gè)線程調(diào)用
    new Thread(rtt, "賣票線程1").start();
    new Thread(rtt, "賣票線程2").start();
    new Thread(rtt, "賣票線程3").start();
}

}
輸出:
總共10張,賣票線程1賣掉1張彪蓬,剩余8
總共10張,賣票線程3賣掉1張,剩余7
總共10張,賣票線程2賣掉1張捺萌,剩余8
總共10張,賣票線程3賣掉1張档冬,剩余5
總共10張,賣票線程1賣掉1張,剩余6
總共10張,賣票線程3賣掉1張桃纯,剩余3
總共10張,賣票線程2賣掉1張酷誓,剩余4
總共10張,賣票線程3賣掉1張,剩余1
總共10張,賣票線程1賣掉1張态坦,剩余2
總共10張,賣票線程2賣掉1張盐数,剩余0

3.Callable
/**

  • 通過Callable和Future創(chuàng)建線程
  • (1)創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法伞梯,該call()方法將作為線程執(zhí)行體玫氢,并且有返回值帚屉。
  • (2)創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例,創(chuàng)建FutureTask來包裝Callable對(duì)象漾峡,
  • 該FutureTask對(duì)象封裝了該Callable對(duì)象的call()方法的返回值攻旦。
  • (3)使用FutureTask對(duì)象作為Thread對(duì)象的Runnable target創(chuàng)建并啟動(dòng)新線程。
  • (4)調(diào)用FutureTask對(duì)象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值

*/

package thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Callable_Test implements Callable<String> {
private int ticketnum = 10;

@Override
public String call() throws Exception {
    int t = 0;
    for (int i = 0; i < 20; i++) {
        if (this.ticketnum > 0) {
            ticketnum--;
            t++;
            System.out.println(Thread.currentThread().getName() + "總共10張,賣掉1張生逸,剩余" + ticketnum);
        }
    }
    return t + "";
}

public static void main(String[] args) {
    Callable_Test ctt = new Callable_Test();
    FutureTask<String> ft1 = new FutureTask<>(ctt);
    FutureTask<String> ft2 = new FutureTask<>(ctt);
    FutureTask<String> ft3 = new FutureTask<>(ctt);
    Thread th1 = new Thread(ft1, "線程1");
    Thread th2 = new Thread(ft2, "線程2");
    Thread th3 = new Thread(ft3, "線程3");
    th1.start();
    th2.start();
    th3.start();

    try {
        System.out.println(th1.getName() + "的返回值:" + ft1.get());
        System.out.println(th2.getName() + "的返回值:" + ft2.get());
        System.out.println(th3.getName() + "的返回值:" + ft3.get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

}

}
輸出:
線程2總共10張,賣掉1張牢屋,剩余7
線程2總共10張,賣掉1張,剩余6
線程2總共10張,賣掉1張槽袄,剩余5
線程2總共10張,賣掉1張烙无,剩余4
線程2總共10張,賣掉1張,剩余3
線程2總共10張,賣掉1張掰伸,剩余2
線程1總共10張,賣掉1張皱炉,剩余7
線程3總共10張,賣掉1張,剩余7
線程1總共10張,賣掉1張狮鸭,剩余0
線程2總共10張,賣掉1張合搅,剩余1
線程1的返回值:2
線程2的返回值:7
線程3的返回值:1

創(chuàng)建線程的三種方式的對(duì)比:
采用實(shí)現(xiàn)Runnable、Callable接口的方式創(chuàng)見多線程時(shí):
優(yōu)勢(shì):
線程類只是實(shí)現(xiàn)了Runnable接口或Callable接口歧蕉,還可以繼承其他類灾部。
Callable有返回值
在這種方式下,多個(gè)線程可以共享同一個(gè)target對(duì)象惯退,所以非常適合多個(gè)相同線程來處理同一份資源的情況赌髓,
從而可以將CPU、代碼和數(shù)據(jù)分開催跪,形成清晰的模型锁蠕,較好地體現(xiàn)了面向?qū)ο蟮乃枷搿?br> 劣勢(shì):
編程稍微復(fù)雜,如果要訪問當(dāng)前線程懊蒸,則必須使用Thread.currentThread()方法荣倾。

使用繼承Thread類的方式創(chuàng)建多線程時(shí):
優(yōu)勢(shì):
編寫簡(jiǎn)單,如果需要訪問當(dāng)前線程骑丸,則無需使用Thread.currentThread()方法舌仍,直接使用this即可獲得當(dāng)前線程。
劣勢(shì):
線程類已經(jīng)繼承了Thread類通危,不能再繼承其他父類铸豁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菊碟,隨后出現(xiàn)的幾起案子节芥,更是在濱河造成了極大的恐慌,老刑警劉巖逆害,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏古,死亡現(xiàn)場(chǎng)離奇詭異增炭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拧晕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梅垄,“玉大人厂捞,你說我怎么就攤上這事《铀浚” “怎么了靡馁?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長机久。 經(jīng)常有香客問我臭墨,道長,這世上最難降的妖魔是什么膘盖? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任胧弛,我火速辦了婚禮,結(jié)果婚禮上侠畔,老公的妹妹穿的比我還像新娘结缚。我一直安慰自己,他們只是感情好软棺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布红竭。 她就那樣靜靜地躺著,像睡著了一般喘落。 火紅的嫁衣襯著肌膚如雪茵宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天瘦棋,我揣著相機(jī)與錄音稀火,去河邊找鬼。 笑死兽狭,一個(gè)胖子當(dāng)著我的面吹牛憾股,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箕慧,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼服球,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了颠焦?” 一聲冷哼從身側(cè)響起斩熊,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎伐庭,沒想到半個(gè)月后粉渠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分冈,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年霸株,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雕沉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡去件,死狀恐怖坡椒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尤溜,我是刑警寧澤倔叼,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站宫莱,受9級(jí)特大地震影響丈攒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜授霸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一巡验、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绝葡,春花似錦深碱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至愉阎,卻和暖如春绞蹦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背榜旦。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國打工幽七, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溅呢。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓澡屡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親咐旧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殖演,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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