線程

線程和進(jìn)程

進(jìn)程

是一個(gè)獨(dú)立的程序郭赐,要占用系統(tǒng)資源(CPU 內(nèi)存)只祠。
特點(diǎn):
    a. 獨(dú)立性:不同的進(jìn)程之間是相互獨(dú)立的涝滴。數(shù)據(jù)也是不共享的。
    b. 動(dòng)態(tài)性:進(jìn)程在系統(tǒng)中鞋吉,運(yùn)行是一個(gè)動(dòng)態(tài)的粮彤。是隨著系統(tǒng)一起運(yùn)作的蜜唾。
    c. 并發(fā)性:多個(gè)進(jìn)程(程序)可以同時(shí)在電腦中運(yùn)行仅醇,互不影響。

線程

是進(jìn)程的(程序)的組成部分昼钻,一個(gè)進(jìn)程(程序)可以同時(shí)執(zhí)行多個(gè)線程掸屡。如一個(gè)軟件的多個(gè)功能。然评。仅财。
線程的執(zhí)行是【搶占式】。多個(gè)線程在同一個(gè)進(jìn)程(程序)中運(yùn)行時(shí)碗淌,會(huì)搶占當(dāng)前進(jìn)程的資源盏求,CPU在不同的線程中間來(lái)回切換抖锥。切換的速度超過(guò)了肉眼識(shí)別,也就是說(shuō)當(dāng)一個(gè)線程執(zhí)行時(shí)碎罚,其他線程會(huì)掛起等待磅废。
java程序中,至少有兩個(gè)線程荆烈,一個(gè)是main函數(shù)拯勉,另一個(gè)就是垃圾回收機(jī)制

線程和進(jìn)程的區(qū)別

1、一個(gè)程序只有一個(gè)進(jìn)程憔购。
2宫峦、一個(gè)進(jìn)程可以有多個(gè)線程,但是至少需要一個(gè)線程玫鸟,否則進(jìn)程無(wú)意義导绷。
3、進(jìn)程五共享資源屎飘,但是線程是會(huì)共享資源
4妥曲、系統(tǒng)打開(kāi)程序(進(jìn)程),需要給當(dāng)前的進(jìn)程(程序)分配新的對(duì)應(yīng)的系統(tǒng)資源枚碗,效率略低逾一。而線程的創(chuàng)建是進(jìn)程中铸本,不需要系統(tǒng)操作肮雨,所以線程的并發(fā)要比進(jìn)程效率高。
5箱玷、系統(tǒng)打開(kāi)進(jìn)程(程序)沒(méi)有創(chuàng)建線程快怨规,操作簡(jiǎn)單,效率高一點(diǎn)锡足。

線程的好處和壞處

好處:
    1波丰、可以讓程序同時(shí)執(zhí)行不同的任務(wù)
    2、可以提高系統(tǒng)資源利用率
壞處:
    1舶得、線程安全問(wèn)題掰烟,共享資源問(wèn)題。迭代器
        // 在迭代器中執(zhí)行刪除操作
        while(it.hasNext()){
            System.out.println(it.next());
            list.remove(2);// 報(bào)錯(cuò)沐批,因?yàn)榇司浜偷鞅旧矶际蔷€程 
        }
    2纫骑、增加CPU負(fù)擔(dān)
    3、降低其他程序的CPU執(zhí)行占用率
    4九孩、容易出現(xiàn)死鎖

創(chuàng)建線程的方式一

package com.thread;
/**
 * 創(chuàng)建線程的第一種方式:
 *      1先馆、自定義線程繼承類Thread類
 *      2、需要【重寫(xiě)】Thread類內(nèi)的run方法躺彬,把需要執(zhí)行的自定義線程放到run方法內(nèi)
 */

class MyThread extends Thread{
    // 重寫(xiě)run方法
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("自定義線程Thread類:"+i);
        }
    }
}

public class Demo01 {
    public static void main(String[] args) {

        // 1煤墙、創(chuàng)建自定義線程對(duì)象
        MyThread mt = new MyThread();
        // 2梅惯、啟動(dòng)線程
        // mt.run();// 直接調(diào)用run方法,只是調(diào)用了一個(gè)普通方法仿野,而不是調(diào)用了線程
        mt.start();// start方法執(zhí)行線程铣减,會(huì)和其他線程搶占資源,具體表現(xiàn)為每次輸出的順序不定
        for (int i = 0; i < 10; i++) {
            System.out.println("main線程:"+i);    
        }
    }
}

線程中常用的方法

1设预、Thread(String name);初始化線程的名字徙歼,屬于線程的一個(gè)構(gòu)造方法
2、setName(String name); 設(shè)置線程的名字
3鳖枕、getName(String name); 獲取線程的名字
4魄梯、static sleep(int ms); 靜態(tài)方法,
 *      需要用Thread類名來(lái)調(diào)用的方法宾符,讓線程進(jìn)入休眠狀態(tài)酿秸,指定時(shí)間(毫秒)
 *      【誰(shuí)執(zhí)行,誰(shuí)休眠】
 *  
5魏烫、static Thread currentThread(); 靜態(tài)方法
 *      需要用Thread類名掉用辣苏,返回當(dāng)前線程
 *      【誰(shuí)執(zhí)行,誰(shuí)返回】
 *  
6哄褒、setPriority(int new newPriority):設(shè)置當(dāng)前線程的優(yōu)先級(jí)稀蟋,優(yōu)先級(jí)范圍是1~10,默認(rèn)5
7呐赡、getPriority(); 返回當(dāng)前線程的優(yōu)先級(jí)退客,只是提高執(zhí)行概率,不是百分百根據(jù)優(yōu)先級(jí)執(zhí)行

代碼實(shí)例

package com.thread;
/**
 * 線程中常用的方法
 *  1链嘀、Thread(String name);初始化線程的名字萌狂,屬于線程的一個(gè)構(gòu)造方法
 *  2、setName(String name); 設(shè)置線程的名字
 *  3怀泊、getName(String name); 獲取線程的名字
 * 
 *  4茫藏、static sleep(int ms); 靜態(tài)方法,
 *      需要用Thread類名來(lái)調(diào)用的方法霹琼,讓線程進(jìn)入休眠狀態(tài)务傲,指定時(shí)間(毫秒)
 *      【誰(shuí)執(zhí)行,誰(shuí)休眠】
 *  
 *  5枣申、static Thread currentThread(); 靜態(tài)方法
 *      需要用Thread類名調(diào)用售葡,返回當(dāng)前線程
 *      【誰(shuí)執(zhí)行,誰(shuí)返回】
 *  
 *  6糯而、setPriority(int new newPriority):設(shè)置當(dāng)前線程的優(yōu)先級(jí)天通,優(yōu)先級(jí)范圍是1~10,默認(rèn)5
 *  7熄驼、getPriority(); 返回當(dāng)前線程的優(yōu)先級(jí)像寒,只是提高執(zhí)行概率烘豹,不是百分百根據(jù)優(yōu)先級(jí)執(zhí)行
 *  
 *  Thread[main,5,main]==
 *  Thread[線程名,優(yōu)先級(jí),線程組]
 */
public class Demo02 extends Thread{
    
    /*
     * super調(diào)用了父類Thread的方法
     *  public Thread(String name) {
            init(null, null, name, 0);
            }
     */
    public Demo02(String name1){
        super(name1);
    }
    
    // 自定義線程
    @Override
    public void run() {
        System.out.println("自定義線程:"+Thread.currentThread());
        //5、static Thread currentThread();此時(shí)自定義線程線程
        Thread currentThread = Thread.currentThread();
        System.out.println("自定義線程:"+currentThread.getName());
        for (int i = 0; i <20; i++) {
            System.out.println("自定義線程:"+i);
            /*
             * 這個(gè)方法是繼承而來(lái)诺祸,而父類的run方法沒(méi)有拋出異常所以只能捕獲携悯,而不能拋出
             * 在其他方法中,使用Thread.sleep可以捕獲或者拋出異常筷笨,而run方法中憔鬼,只能捕獲
             * 
             * 因?yàn)椋?             *      在Java語(yǔ)法中,重寫(xiě)父類的方法胃夏,要求和父類方法的聲明是一致的轴或。如:
             *          public static void test()
             *      父類方法中,沒(méi)有拋出任何異常仰禀,那么子類的方法如果出現(xiàn)異常照雁,也不能拋出,只能捕獲
             */
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        // 創(chuàng)建自定義線程類對(duì)象
        //1答恶、Thread(String name);初始化線程的名字饺蚊,屬于線程的一個(gè)構(gòu)造方法    
        Demo02 d02 = new Demo02("AAAA");
        
        // 5、static Thread currentThread() 此時(shí)是main線程
        Thread currentThread = Thread.currentThread();
        // 設(shè)置優(yōu)先級(jí)悬嗓,只是影響執(zhí)行概率污呼,而不是真的優(yōu)先
        currentThread.setPriority(1);
        System.out.println("當(dāng)前線程:"+currentThread());
        System.out.println("當(dāng)前線程:"+currentThread.getName());
        
        //3、getName(String name); 獲取線程的名字
        System.out.println(d02.getName());
        //2包竹、setName(String name); 設(shè)置線程的名字
        d02.setName("BBBB");
        //6燕酷、setPriority(int new newPriority):設(shè)置當(dāng)前線程的優(yōu)先級(jí),優(yōu)先級(jí)范圍是1~10映企,默認(rèn)5
        d02.setPriority(10);
        System.out.println(d02.getName());
        
        // 啟動(dòng)線程不是調(diào)用run方法悟狱,而是執(zhí)行start()
        d02.start();
        
        for (int i = 0; i <20; i++) {
            System.out.println("main線程:"+i);
            Thread.sleep(500);
        }
    }

}

創(chuàng)建線程的方式二

package com.thread;



/*
 * 為了解決java是一個(gè)單繼承語(yǔ)言
 *  如果繼承了線程類静浴,就不能繼承其他類反之亦然
 * 
 * 所以建議使用第二種創(chuàng)建線程的方法:
 *      讓自定義線程類【遵從】Runnable接口堰氓,實(shí)現(xiàn)Runnable接口中run方法,從而變成一個(gè)線程類
 * 
 * 1苹享、自定義遵從Runnable接口的類
 * 2双絮、實(shí)現(xiàn)run方法,在run方法中寫(xiě)線程代碼
 * 3得问、創(chuàng)建線程類Thread對(duì)象囤攀,把Runnbale接口的實(shí)現(xiàn)類作為構(gòu)造方法的參數(shù)
 * 4、利用Thread()的start方法
 *  
 * 也可以簡(jiǎn)單的使用匿名內(nèi)部類
 */

class TestRunnable implements Runnable{
    
    // 實(shí)現(xiàn)【遵從】Runnable接口之后宫纬,一定要實(shí)現(xiàn)的方法
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("當(dāng)前線程為:"+i+" "+Thread.currentThread());
        }
    }
    
    
}
public class Demo03 {

    public static void main(String[] args) {
        
        TestRunnable tr = new TestRunnable(); 
        Thread thread = new Thread(tr);
        thread.start();
        
        /*
         * 匿名內(nèi)部類的方法
         * 利用匿名內(nèi)部類的匿名對(duì)象作為T(mén)hread類的構(gòu)造方法的參數(shù)焚挠,創(chuàng)建Thread類的匿名對(duì)象,直接調(diào)用start方法
         */
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("匿名內(nèi)部類作為方法的參數(shù):"+i);
                }   
            }
        }).start();
    }

}








package com.thread;
/*
 * 售票問(wèn)題
 * 
 * 賣(mài)出票后漓骚,還沒(méi)有執(zhí)行到 ticket--語(yǔ)句蝌衔,會(huì)被其他線程搶去CPU執(zhí)行權(quán)
 * 避免資源搶占----上鎖
 * 【Java線程同步機(jī)制】
 * 同步代碼塊:
 *  格式:
 *      synchronized(鎖對(duì)象){
 *  加鎖代碼榛泛。有且只有一個(gè)線程能進(jìn)入執(zhí)行,直到線程執(zhí)行完畢
 *  }
 *注意事項(xiàng):
 *  1噩斟、鎖對(duì)象可以是任意類型曹锨,但是只能是同一個(gè)對(duì)象,不能new對(duì)象剃允,每次執(zhí)行都是不同對(duì)象
 *  2沛简、sleep()不會(huì)釋放鎖對(duì)象,不會(huì)開(kāi)鎖
 *  3斥废、使用同步代碼塊椒楣,必須是真正意義上的線程搶占系統(tǒng)共享資源,同步的代碼越少越好
 *
 */

class SaleTicket extends Thread{
    private static int ticket = 50;
    public SaleTicket(String name){
        super(name);
        }
    @Override
    public void run() {
        
        
        while(true){
            synchronized ("鎖") {
                
            
            if (ticket >0){
                System.out.println(Thread.currentThread().getName()+"已售出"+ticket+"張電影票");
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                System.out.println("售罄!!!");
                break;
            }
            ticket--;
        }
        }
    }
}

public class Demo04 {

    public static void main(String[] args) {
        SaleTicket s1 = new SaleTicket("淘票票");
        SaleTicket s2 = new SaleTicket("貓眼");
        SaleTicket s3 = new SaleTicket("糯米");
        
        s1.start();
        s2.start();
        s3.start();

    }

}



package com.thread;
/**
 * 死鎖
 * 1牡肉、 存在兩個(gè)或者兩個(gè)以上的線程
 * 2撒顿、存在兩個(gè)或者靈感以上的共享資源給這些線程使用
 * @author Administrator
 *
 */

class DeadLock implements Runnable{

    @Override
    public void run() {
        if(Thread.currentThread().getName().equals("小明")){
            synchronized ("電池") {
                System.out.println("小明拿到電池,想要遙控器");
                
                synchronized ("遙控器") {
                    System.out.println("小明拿到了遙控器荚板,開(kāi)啟了電視");
                    
                }
            }
            
        }else if(Thread.currentThread().getName().equals("小紅")){
            synchronized ("遙控器") {
            System.out.println("我有遙控器凤壁,給我電池");
            synchronized ("電池") {
                System.out.println("小紅拿到了電池,開(kāi)啟了電視");
                
            }
            }
            
        }
        
    }
    
}

public class Demo05 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread t1 = new Thread(new DeadLock(),"小明");
        Thread t2 = new Thread(new DeadLock(),"小紅");
        t1.start();
        t2.start();
        
    }

}


package com.thread;
/**
 * 守護(hù)線程(后臺(tái)線程)
 * 
 *  例如:
 *      軟件的自動(dòng)更新跪另,軟件的日志拧抖,軟件的監(jiān)聽(tīng)
 * 
 *  特征:
 *      一旦整個(gè)程序運(yùn)行結(jié)束,只剩下守護(hù)線程免绿,這個(gè)時(shí)候守護(hù)線程也會(huì)跟著銷毀唧席,因?yàn)闆](méi)有意義
 * 
 *  Java了垃圾回收機(jī)制是守護(hù)線程還是普通線程
 *      守護(hù)線程!嘲驾!
 */
public class Demo06 extends Thread{
    
    public Demo06(String name){
        super(name);
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("軟件下載更新中...."+i+"%");
            if(i == 100){
                System.out.println("下載完成淌哟,是否安裝");
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }

public static void main(String[] args) throws InterruptedException {
    Demo06 d = new Demo06("守護(hù)線程");
    
    // 設(shè)置為守護(hù)線程
    d.setDaemon(true);
    d.start();
    for (int i = 0; i <= 50; i++) {
        Thread.sleep(100);
        System.out.println("主程序:"+i);
        
    }
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辽故,隨后出現(xiàn)的幾起案子徒仓,更是在濱河造成了極大的恐慌,老刑警劉巖誊垢,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉弛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喂走,警方通過(guò)查閱死者的電腦和手機(jī)殃饿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)芋肠,“玉大人乎芳,你說(shuō)我怎么就攤上這事。” “怎么了奈惑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谬晕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我携取,道長(zhǎng)攒钳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任雷滋,我火速辦了婚禮不撑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晤斩。我一直安慰自己焕檬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布澳泵。 她就那樣靜靜地躺著实愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兔辅。 梳的紋絲不亂的頭發(fā)上腊敲,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音维苔,去河邊找鬼碰辅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛介时,可吹牛的內(nèi)容都是我干的没宾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼沸柔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼循衰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起褐澎,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤会钝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后乱凿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體顽素,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咽弦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年徒蟆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片型型。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡段审,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闹蒜,到底是詐尸還是另有隱情寺枉,我是刑警寧澤抑淫,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站姥闪,受9級(jí)特大地震影響始苇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筐喳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一催式、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避归,春花似錦荣月、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至账锹,卻和暖如春萌业,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸柬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工咽白, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸟缕。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓晶框,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懂从。 傳聞我的和親對(duì)象是個(gè)殘疾皇子授段,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    小徐andorid閱讀 2,808評(píng)論 3 53
  • 【JAVA 線程】 線程 進(jìn)程:是一個(gè)正在執(zhí)行中的程序。每一個(gè)進(jìn)程執(zhí)行都有一個(gè)執(zhí)行順序番甩。該順序是一個(gè)執(zhí)行路徑侵贵,或者...
    Rtia閱讀 2,768評(píng)論 2 20
  • ??一個(gè)任務(wù)通常就是一個(gè)程序,每個(gè)運(yùn)行中的程序就是一個(gè)進(jìn)程缘薛。當(dāng)一個(gè)程序運(yùn)行時(shí)窍育,內(nèi)部可能包含了多個(gè)順序執(zhí)行流,每個(gè)順...
    OmaiMoon閱讀 1,677評(píng)論 0 12
  • 這次不多扯皮了宴胧,我們上一次玩了一下估值器TypeEvaluator漱抓,通過(guò)在這個(gè)東西,我們也會(huì)用了onObject方...
    季白zy閱讀 451評(píng)論 0 0
  • 文:佳小Der 連續(xù)加班一個(gè)月之后恕齐,一個(gè)陽(yáng)光明媚的午后乞娄,拿鐵,藍(lán)莓芝士,一本舒心的小書(shū)和正好配合情緒的音樂(lè)仪或,哦确镊,就...
    佳佳娃兒JR閱讀 278評(píng)論 0 0