線程

進程A和進程B的內(nèi)存獨立不共享。
線程A和線程B在Java語言中抄腔,線程A和線程B瓢湃,堆內(nèi)存和方法區(qū)內(nèi)存共享理张,但棧內(nèi)存獨立,一個線程一個棧
假設(shè)啟動10個線程绵患,會有10個椢戆龋空間,每個棧和每個棧之間落蝙,互不干擾织狐,各自執(zhí)行各自的,這就是多線程并發(fā)筏勒,Java之所以有多線程機制移迫,目的就是為了提高程序的處理效率

Java語言中,實現(xiàn)線程有兩種方式

第一種:編寫一個類管行,直接繼承java.lang.Thread厨埋,重寫run方法。
public class ThreadTest02
{
    public static void main(String[] args)
    {
        //這里是main方法捐顷,這里的代碼屬于主線程揽咕,在主棧中運行。
        //新建一個分支線程對象
        MyThread myThread=new MyThread();
        //啟動線程
        //start()方法的作用是:啟動一個分支線程套菜,在JVM中開辟一個新的棧空間设易,這段代碼在任務(wù)完成之后瞬間就結(jié)束了
        //這段代碼的任務(wù)只是為了開啟一個新的椂翰瘢空間,只要新的椂俜危空間開出來戏溺,start()方法就結(jié)束了,線程就啟動成功了
        //啟動成功的線程會自動調(diào)用run方法屠尊,并且run方法在分支棧的棧底部(壓棧)
        //run方法在分支棧的棧底部旷祸,main方法在主棧的棧底部,run和main是平級的
        myThread.start();
        //這里的代碼還是運行在主線程中
        for (int i = 0; i < 1000; i++) {
            System.out.println("主線程---->"+i);
        }
    }

}

class MyThread extends Thread {
    @Override
    public void run()
    {
        //編寫程序讼昆,這段程序運行在分支線程中(分支線)
        for(int i=0;i<1000;i++){
            System.out.println("分支線程---->"+i);
        }
    }
}
第二種:編寫一個類托享,實現(xiàn)java.lang.Runnable接口,實現(xiàn)run方法浸赫。
public class ThreadTest03
{
    public static void main(String[] args)
    {
        //創(chuàng)建一個可運行的對象
        MyRunnable myRunnable=new MyRunnable();
        //將可運行的對象封裝成一個線程對象
        Thread thread=new Thread(myRunnable);
        //啟動線程
        thread.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("主線程--->"+i);
        }
    }
}

class MyRunnable implements Runnable{

    @Override
    public void run()
    {
        for (int i = 0; i < 100; i++) {
            System.out.println("支線程--->"+i);
        }
    }
}
匿名內(nèi)部類方式
public class ThreadTest04
{
    public static void main(String[] args)
    {
        //創(chuàng)建線程對象闰围,采用匿名內(nèi)部類方式
        //這是通過一個沒有名字的類,new出來的對象
        Thread thread=new Thread(new Runnable(){
            @Override
            public void run()
            {
                for (int i = 0; i < 100; i++) {
                    System.out.println("thread線程--->"+i);
                }
            }
        });

        thread.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("main線程--->"+i);
        }
    }
} 

線程的生命周期

線程名字

1既峡、獲取線程對象名字:
String name = 線程對象.getName();
2羡榴、設(shè)置線程對象名:
線程對象.setName("線程名字");
3、若沒有給線程對象設(shè)置名字時运敢,默認的名字有什么規(guī)律校仑?
Thread-0
Thread-1
Thread-2
······
4忠售、獲取當前線程對象
Thread t= Thread.currentThread();
返回值t就是當前線程

關(guān)于線程的sleep方法:

static void sleep(long millis)
1、靜態(tài)方法:Thread.sleep(1000);
2迄沫、參數(shù)時毫秒
3稻扬、作用:讓讓當前線程進入休眠,進入”阻塞狀態(tài)“邢滑,放棄占有CPU時間片腐螟,讓給其他線程使用。
這行代碼出現(xiàn)在A線程中困后,A線程就會進入休眠乐纸。
這行代碼出現(xiàn)在B線程中,B線程就會進入休眠摇予。
4汽绢、Thread.sleep()方法,可以做到這種效果
間隔特定的事件侧戴,去執(zhí)行一段特定的代碼宁昭,每隔多久執(zhí)行一次。

關(guān)于sleep的面試題

public class ThreadTest06
{
    public static void main(String[] args)
    {
        Thread t=new MyThread3();
        t.setName("t");
        t.start();

        try {
            t.sleep(1000*5);//在執(zhí)行的時候還是會轉(zhuǎn)換成:Thread.sleep(1000*5);
                                  //這行代碼的作用市:讓當前線程進入休眠酗宋,也就是說main線程進入休眠
                                  //這樣代碼出現(xiàn)在main方法中积仗,main線程睡眠
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("hello,world");
    }
}

class MyThread3 extends Thread{
    public void run(){
        for (int i = 0; i < 10; i++) {
            System.out.println("支線程--->"+i);
        }
    }
}

重點:run()當中的異常不能throw,只能try蜕猫,catch
因為run()方法在父類中沒有拋出任何異常寂曹,子類不能比父類拋出更多的異常

將正在睡眠的線程喚醒(終止)

public class ThreadTest07
{
    public static void main(String[] args)
    {
        Thread t=new Thread(new MyRunnable2());
        t.setName("t");
        t.start();
        //終斷t線程的睡眠(這種終斷睡眠的方式依靠了java的異常處理機制)
        t.interrupt();
    }
}

class MyRunnable2 implements Runnable{

    @Override
    public void run()
    {
        System.out.println(Thread.currentThread().getName()+"--->begin");
        try {
            Thread.sleep(1000*60*60*24*365);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"--->end");
    }
}

依靠的是Java異常處理機制,當執(zhí)行t.interrupt()方法回右,會使run中的Thread.sleep(1000606024365);語句報錯隆圆,打印錯誤,整個try/catcha結(jié)構(gòu)結(jié)束翔烁。

合理的終止一個線程的方法

public class ThreadTest08
{
    public static void main(String[] args)
    {
        MyRunnable3 r3=new MyRunnable3();
        Thread t=new Thread(r3);
        t.setName("t");
        t.start();
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        r3.flag=false;
    }
}

class MyRunnable3 implements Runnable{

    boolean flag=true;
    @Override
    public void run()
    {
        for (int i = 0; i < 100; i++) {
            if (flag){
                System.out.println(Thread.currentThread().getName()+"--->"+i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else {
                return;
            }

        }
    }
}

合并線程

class MyThread1 extends Thread {
  public void doSome(){
    MyThread2 t=new MyThread2();
    t.join();//當前線程進入阻塞渺氧,t線程執(zhí)行,直到t線程結(jié)束蹬屹,當前線程才可以執(zhí)行
  }
}
class MyThread2 extends Thread{
}
package thread;

public class ThreadTest09
{
    public static void main(String[] args)
    {
        System.out.println("main 啟動");
        Thread thread=new Thread(new MyRunnable4());
        thread.setName("t");
        thread.start();
        try {
            thread.join();//將thread合并到當前線程中侣背,使當前線程阻塞,thread線程執(zhí)行直到結(jié)束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main 關(guān)閉");
    }
}

class MyRunnable4 implements Runnable{

    @Override
    public void run()
    {
        for (int i = 0; i < 1000; i++) {
            String name=Thread.currentThread().getName();
            System.out.println(name+"--->"+i);
        }    
    }
}

join()語句使兩個棧之間發(fā)生的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慨默,一起剝皮案震驚了整個濱河市秃踩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌业筏,老刑警劉巖憔杨,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒜胖,居然都是意外死亡消别,警方通過查閱死者的電腦和手機抛蚤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寻狂,“玉大人岁经,你說我怎么就攤上這事∩呷” “怎么了缀壤?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纠亚。 經(jīng)常有香客問我塘慕,道長,這世上最難降的妖魔是什么蒂胞? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任图呢,我火速辦了婚禮,結(jié)果婚禮上骗随,老公的妹妹穿的比我還像新娘蛤织。我一直安慰自己,他們只是感情好鸿染,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布指蚜。 她就那樣靜靜地躺著,像睡著了一般涨椒。 火紅的嫁衣襯著肌膚如雪摊鸡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天丢烘,我揣著相機與錄音,去河邊找鬼些椒。 笑死播瞳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的免糕。 我是一名探鬼主播赢乓,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼石窑!你這毒婦竟也來了牌芋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤松逊,失蹤者是張志新(化名)和其女友劉穎躺屁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體经宏,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡犀暑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年驯击,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耐亏。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡徊都,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出广辰,到底是詐尸還是另有隱情暇矫,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布择吊,位于F島的核電站李根,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏干发。R本人自食惡果不足惜朱巨,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枉长。 院中可真熱鬧冀续,春花似錦、人聲如沸必峰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吼蚁。三九已至凭需,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肝匆,已是汗流浹背粒蜈。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旗国,地道東北人枯怖。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像能曾,于是被迫代替她去往敵國和親度硝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349