java線程基礎(chǔ)

1.通過繼承Thread類創(chuàng)建線程

public class Thread extends Object implements Runnabel

  • Thread類已經(jīng)實(shí)現(xiàn)了Runnable接口
  • 繼承Tread的類只需重寫run方法
  • Thread類已經(jīng)定義了final類型的getName和setName方法
  • 啟動線程應(yīng)調(diào)用start方法而不是run方法
  • 一個線程對象只能調(diào)用一次start方法,否則會拋IllegalThreadStartException錯誤
package com.gyp.thread.start;

public class Test1 extends Thread{
    private String name;
    
    public Test1(){
    }
    public Test1(String name){
        setName(name);
    }
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("當(dāng)前運(yùn)行的線程:"+getName()+",i="+i);
        }
    }
    
    public static void main(String[] args){
        Test1 t1 = new Test1();
        Test1 t2 = new Test1("線程2");
        t1.start();
        t2.start();
        //受單繼承的影響
//      t2.start(); 
    }
}

2.通過實(shí)現(xiàn)Runnable接口創(chuàng)建線程

public interface Runnable{ public abstract void run(); }

  • Runnable只提供了run方法
  • Runnable對線程沒有任何支持局装,在獲得線程實(shí)例后必須通過Thread類的構(gòu)造函數(shù)來實(shí)現(xiàn)
package com.gyp.thread.start;

public class Test2 implements Runnable {
    private String name;
    
    //實(shí)現(xiàn)接口的類要自己定義方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Test2(){
    }
    
    public Test2(String name){
        setName(name);
    }
    
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("當(dāng)前運(yùn)行的線程:"+getName()+",i="+i);
        }
    }
    
    public static void main(String[] args){
        Test2 r1 = new Test2();
        Test2 r2 = new Test2("線程2");
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);
        t1.start();
        t2.start();
    }
}

2.5繼承Thread類和實(shí)現(xiàn)Runnable接口的區(qū)別

  • 一般選擇后者
    • 避免單繼承帶來的局限性
    • 適合多個相同程序代碼的線程區(qū)處理同一資源的情況峻汉。
  • 前者處理同一資源可用靜態(tài)變量善延。

3.主線程-main()

  • 主線程是自動創(chuàng)建的锐朴,是產(chǎn)生應(yīng)用程序所有其他線程的線程。
  • 程序中只要還有其他非守護(hù)線程沒有結(jié)束个盆,主線程就不會結(jié)束假抄,即使主線程已執(zhí)行完或者調(diào)用了retuen。
  • 一個java程序最少有兩個線程踏志,一個是main,優(yōu)先級5阀捅,一個是JVM垃圾收集線程
package com.gyp.thread.start;

public class Test3 implements Runnable {
    public void run(){
        for(int i=0; i<10; i++){
            System.out.println("當(dāng)前運(yùn)行線程:"+Thread.currentThread()+", i="+i);
        }
    }
    
    public static void main(String[] args){
        //獲取當(dāng)前對象的線程引用
        Thread mi = Thread.currentThread();
        System.out.println("線程的信息:"+mi);
        System.out.println("線程的名字:"+mi.getName());
        mi.setName("主線程");
        System.out.println("線程的名字:"+mi.getName());
        
        Test3 r = new Test3();
        Thread t = new Thread(r);
        t.start();
        t.run();    //直接調(diào)用run方法
    }
}

4.線程的加入join()

使當(dāng)前運(yùn)行的線程停下來,等待調(diào)用join的線程執(zhí)行针余,可設(shè)最長等待時(shí)間饲鄙,也可不設(shè)等他執(zhí)行完凄诞。

package com.gyp.thread.start;

import java.util.Date;

/**
 * @author gyp19
 * 線程的加入join()
 * 等待調(diào)用的線程終止
 */

class ThreadTest4 implements Runnable{
    public void run(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for(int i=0;i<5;i++){
            System.out.println("當(dāng)前運(yùn)行的線程:"+Thread.currentThread().getName()+" ,i="+i+"時(shí)間:"+new Date());
        }
    }
}
public class Test4 {
    public static void main(String[] arge){
        ThreadTest4 r = new ThreadTest4();
        Thread t = new Thread(r,"線程一");
        Thread mi = Thread.currentThread();//獲得主線程的引用
        t.start();
        for(int i=0;i<10;i++){
            if(i==5){
                try {
                    t.join(3000);   //最大等待時(shí)間3s
//                  mi.join(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("main="+i+",時(shí)間:"+new Date());
        }
        
    }
}

5.線程的喚醒 interrupt()

線程從休眠的組賽狀態(tài)(sleep)轉(zhuǎn)化為運(yùn)行狀態(tài)忍级。

package com.gyp.thread.start;

import java.util.Date;

class ThreadTest5 implements Runnable{
    public void run(){
        System.out.println("線程開始的時(shí)間:"+new Date());
        for(int i=0;i<5;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
//              e.printStackTrace();
                System.out.println("線程被喚醒啦啦啦");
            }
            System.out.println(Thread.currentThread().getName()+"的第"+i+1+"秒"+", 時(shí)間:"+new Date());
        }
        System.out.println("線程的結(jié)束時(shí)間:"+new Date());
    }
}

public class Test5 {
    public static void main(String[] args){
        ThreadTest5 r = new ThreadTest5();
        Thread t = new Thread(r,"線程一");
        t.start();
        try {
            Thread.sleep(2000);//使用t.sleep(2000);的效果也是一樣一樣的
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t.interrupt();      //喚醒線程
    }
}

6.后臺線程

  1. 后臺執(zhí)行的線程帆谍,也可稱之為守護(hù)線程。
  2. JVM垃圾回回收線程就是典型的守護(hù)線程轴咱。
  3. 后臺線程為其他線程服務(wù)汛蝙,當(dāng)所有非后臺線程結(jié)束時(shí)后臺線程才結(jié)束。
  4. main()是一個非后臺線程朴肺。

setDaemon(true) : 設(shè)置后臺線程
isDaemon() : 判斷是否為后臺線程窖剑,是則true

package com.gyp.thread.start;

public class Test6 implements Runnable{
    
    public void run(){
        int i=0;
        while(true){
            System.out.println("i="+(i++));
        }
    }
    
    public static void main(String[] args){
        Test6 r = new Test6();
        Thread t = new Thread(r,"線程一");
        t.setDaemon(true);
        if(t.isDaemon()){
            t.start();
        }
        System.out.println("say something");
    }
}

7.線程的禮讓

1.當(dāng)前正在運(yùn)行的線程推出運(yùn)行狀態(tài),暫時(shí)讓其他線程執(zhí)行戈稿。
2.不能讓給指定的線程西土,一般優(yōu)先級高的線程會先當(dāng)?shù)竭\(yùn)行資源。
3.sleep和yield的區(qū)別

  • sleep讓出運(yùn)行權(quán)時(shí)不考慮別的線程的優(yōu)先級鞍盗。
  • sleep轉(zhuǎn)到堵塞狀態(tài)需了,yield轉(zhuǎn)到就緒狀態(tài)。
  • sleep會拋出異常般甲。
  • slepp有著更好的移植性援所,不能依靠yield方法提高程序的并發(fā)性。

yield() : 調(diào)用禮讓

package com.gyp.thread.start;

class ThreadDemo1 implements Runnable{
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("禮讓->"+Thread.currentThread().getName()+":i="+i);
            //線程的禮讓
            Thread.currentThread().yield();
        }
    }
}
class ThreadDemo2 implements Runnable{
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println(Thread.currentThread().getName()+":i="+i);
        }
    }
}

public class Test7 {
    public static void main(String[] args){
        Runnable r1 = new ThreadDemo1();
        Runnable r2 = new ThreadDemo2();
        Thread t1 = new Thread(r1,"Thread-one");
        Thread t2 = new Thread(r2,"線程二");
        t1.start();
        t2.start();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欣除,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挪略,更是在濱河造成了極大的恐慌历帚,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠娱,死亡現(xiàn)場離奇詭異挽牢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)摊求,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門禽拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人室叉,你說我怎么就攤上這事睹栖。” “怎么了茧痕?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵野来,是天一觀的道長。 經(jīng)常有香客問我踪旷,道長曼氛,這世上最難降的妖魔是什么豁辉? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮舀患,結(jié)果婚禮上徽级,老公的妹妹穿的比我還像新娘。我一直安慰自己聊浅,他們只是感情好餐抢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狗超,像睡著了一般弹澎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上努咐,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天苦蒿,我揣著相機(jī)與錄音,去河邊找鬼渗稍。 笑死佩迟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竿屹。 我是一名探鬼主播报强,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拱燃!你這毒婦竟也來了秉溉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤碗誉,失蹤者是張志新(化名)和其女友劉穎召嘶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哮缺,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弄跌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尝苇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铛只。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖糠溜,靈堂內(nèi)的尸體忽然破棺而出淳玩,到底是詐尸還是另有隱情,我是刑警寧澤非竿,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布凯肋,位于F島的核電站,受9級特大地震影響汽馋,放射性物質(zhì)發(fā)生泄漏侮东。R本人自食惡果不足惜圈盔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悄雅。 院中可真熱鬧驱敲,春花似錦、人聲如沸宽闲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽容诬。三九已至娩梨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間览徒,已是汗流浹背狈定。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留习蓬,地道東北人纽什。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像躲叼,于是被迫代替她去往敵國和親芦缰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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