線程基礎(chǔ)

進(jìn)程

一個(gè)靜態(tài)概念

線程

在一個(gè)時(shí)間點(diǎn)內(nèi) cpu只能執(zhí)行一個(gè)線程,分成多個(gè)時(shí)間片去分給線程占用泵额,短時(shí)間察覺不到,感覺在運(yùn)行多個(gè)線程
真正的多線程:多cpu 多內(nèi)核 確確實(shí)實(shí)是多線程
相對于進(jìn)程是動(dòng)態(tài)的
一個(gè)程序里執(zhí)行的不同路徑员寇,main是主線程

java操作線程

  • java線程是通過java.lang.Thread類來實(shí)現(xiàn)的
  • VM啟動(dòng)時(shí)昧穿,會(huì)有由主方法所定義的線程
  • 可以通過創(chuàng)建Thread實(shí)例來創(chuàng)建
  • 每個(gè)線程都是通過某個(gè)Thread對象所對應(yīng)的方法run()來完成其操作的凡壤,run()為線程體
  • 通過Thread類的start()方法來啟動(dòng)一個(gè)線程

兩種方法實(shí)現(xiàn)線程

  • f1
public class RunnableTest {
    public static void main(String[] args) {
        //啟動(dòng)線程
        Runner runner = new Runner();
        Thread thread = new Thread(runner);
        thread.start();
        loop();
    }
    public static void loop() {
        for(int i = 0 ;i<10;i++){
            System.out.println("main "+i);
        }
    }
}

class Runner implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        
        for(int i = 0 ;i<10;i++){
            System.out.println("Runner "+i);
        }
    }
    
}
/*
 * 
main 0
main 1
main 2
Runner 1
Runner 2
Runner 3
Runner 4
main 3
Runner 5
Runner 6
main 4
Runner 7
Runner 8
main 5
Runner 9
main 6
main 7
main 8
main 9*/
  • f2
public class ThreadTest {
    public static void main(String[] args) {
        //啟動(dòng)線程
        Runner1 runner1 = new Runner1();
        runner1.start();
        loop();
    }
    public static void loop() {
        for(int i = 0 ;i<10;i++){
            System.out.println("main "+i);
        }
    }
}

class Runner1 extends Thread{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int i = 0 ;i<10;i++){
            System.out.println("Runner1 "+i);
        }
    }
}

sleep署尤、interrupt實(shí)驗(yàn)

import java.util.Date;


public class InterrputTest {
    public static void main(String[] args) {
        Runner3 runner3 = new Runner3();
        runner3.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        runner3.interrupt();
    }
}

class Runner3 extends Thread{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){
            System.out.println(new Date());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                System.out.println("kill");
                e.printStackTrace();
                return;
            }
        }
    }
}
Wed Nov 08 21:54:05 CST 2017
Wed Nov 08 21:54:06 CST 2017
Wed Nov 08 21:54:07 CST 2017
Wed Nov 08 21:54:08 CST 2017
Wed Nov 08 21:54:09 CST 2017
Wed Nov 08 21:54:10 CST 2017
Wed Nov 08 21:54:11 CST 2017
Wed Nov 08 21:54:12 CST 2017
Wed Nov 08 21:54:13 CST 2017
Wed Nov 08 21:54:14 CST 2017
kill
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at Runner3.run(InterrputTest.java:26)

join實(shí)驗(yàn)(合并線程)

import java.util.Date;


public class JoinTest {
    public static void main(String[] args) {
        Runner4 runner4 = new Runner4();
        runner4.start();
        
        try {
            runner4.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for(int i = 0 ;i < 10;i++){
            System.out.println("main thread: "+new Date());
        }
    }

}

class Runner4 extends Thread {
    public void run(){
        for(int i = 0 ;i < 10;i++){
            System.out.println("runner4 thread: "+new Date());
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return;
            }
        }
    }
}
runner4 thread: Wed Nov 08 22:11:51 CST 2017
runner4 thread: Wed Nov 08 22:11:52 CST 2017
runner4 thread: Wed Nov 08 22:11:53 CST 2017
runner4 thread: Wed Nov 08 22:11:54 CST 2017
runner4 thread: Wed Nov 08 22:11:55 CST 2017
runner4 thread: Wed Nov 08 22:11:56 CST 2017
runner4 thread: Wed Nov 08 22:11:57 CST 2017
runner4 thread: Wed Nov 08 22:11:58 CST 2017
runner4 thread: Wed Nov 08 22:11:59 CST 2017
runner4 thread: Wed Nov 08 22:12:00 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017
main thread: Wed Nov 08 22:12:01 CST 2017

yield

讓出CPU,給其他線程執(zhí)行的機(jī)會(huì)

import java.util.Date;


public class YeildTest {
    public static void main(String[] args) {
        Runner5 first = new Runner5("First thread!");
        Runner5 second = new Runner5("Second thread!");
        first.start();second.start();
        
    }
}

class Runner5 extends Thread{
    Runner5(String name){
        super(name);
    }
    public void run() {
        for(int i = 0 ; i<= 20; i++){
            System.out.println(getName()+" "+i);
            if(i%10==0){
                yield();  //切換線程
            }
        }
    }
}

priority

線程優(yōu)先級


public class PriorityTest {
    public static void main(String[] args) {
        Thread aThread = new Thread(new Runner6());
        Thread bThread = new Thread(new Runner7());
        aThread.setPriority(Thread.NORM_PRIORITY+2);
        aThread.start();bThread.start();
    }
}

class Runner6 implements Runnable{
    public void run() {
        for(int i = 0 ; i<= 20; i++){
            System.out.println("A" + i);
        }
    }
}

class Runner7 implements Runnable{
    public void run() {
        for(int i = 0 ; i<= 20; i++){
            System.out.println("B" + i);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亚侠,一起剝皮案震驚了整個(gè)濱河市曹体,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硝烂,老刑警劉巖箕别,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滞谢,居然都是意外死亡串稀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狮杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來母截,“玉大人,你說我怎么就攤上這事橄教∥⒊辏” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵颤陶,是天一觀的道長。 經(jīng)常有香客問我陷遮,道長滓走,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任帽馋,我火速辦了婚禮搅方,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绽族。我一直安慰自己姨涡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布吧慢。 她就那樣靜靜地躺著涛漂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匈仗,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天瓢剿,我揣著相機(jī)與錄音,去河邊找鬼悠轩。 笑死间狂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的火架。 我是一名探鬼主播鉴象,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼何鸡!你這毒婦竟也來了纺弊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤音比,失蹤者是張志新(化名)和其女友劉穎俭尖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洞翩,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稽犁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骚亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已亥。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖来屠,靈堂內(nèi)的尸體忽然破棺而出虑椎,到底是詐尸還是另有隱情,我是刑警寧澤俱笛,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布捆姜,位于F島的核電站,受9級特大地震影響迎膜,放射性物質(zhì)發(fā)生泄漏泥技。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一磕仅、第九天 我趴在偏房一處隱蔽的房頂上張望珊豹。 院中可真熱鬧,春花似錦榕订、人聲如沸店茶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贩幻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間段直,已是汗流浹背吃溅。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸯檬,地道東北人决侈。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像喧务,于是被迫代替她去往敵國和親赖歌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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

  • 前言 多線程并發(fā)編程是Java編程中重要的一塊內(nèi)容功茴,也是面試重點(diǎn)覆蓋區(qū)域庐冯,所以學(xué)好多線程并發(fā)編程對我們來說極其重要...
    嘟爺MD閱讀 7,315評論 21 272
  • 寫在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的,為什么轉(zhuǎn)載兩個(gè)字加“”呢坎穿?因?yàn)檫@絕不是簡單的復(fù)制粘貼展父,我花了五六個(gè)小...
    SmartSean閱讀 4,730評論 12 45
  • 一、線程概念 1. 操作系統(tǒng)中的線程現(xiàn)在的操作系統(tǒng)是多任務(wù)操作系統(tǒng)玲昧,多線程是實(shí)現(xiàn)多任務(wù)的一種方式栖茉,在操作系統(tǒng)中,每...
    TyiMan閱讀 1,910評論 1 35
  • 1 當(dāng)公司大樓里一天的忙碌終于結(jié)束的時(shí)候孵延,別人一身疲憊吕漂,我卻十分輕松,因?yàn)橄掳嘤谒麄兌允且惶斓慕Y(jié)束尘应,對我而言卻只...
    鶴飛甌越閱讀 1,054評論 4 10
  • 看到這個(gè)題目犬钢,很多人都會(huì)以為我淪陷在封建迷信里了苍鲜。在這里我想說,你們認(rèn)為的沒有錯(cuò)玷犹。緩和一下題目的沉重感坡贺。 ...
    瑾萱兒閱讀 391評論 0 0