初識多線程

進程:進程指正在運行的程序骗露。確切的來說岭佳,當一個程序進入內(nèi)存運行,即變成一個進程萧锉,進程是處于運行過程中的程序珊随,并且具有一定獨立功能。

線程:線程是進程中的一個執(zhí)行單元驹暑,負責當前進程中程序的執(zhí)行玫恳,一個進程中至少有一個線程。一個進程中是可以有多個線程的优俘,這個應用程序也可以稱之為多線程程序京办。

簡而言之:一個程序運行后至少有一個進程,一個進程中可以包含多個線程

什么是多線程呢帆焕?即就是一個程序中有多個線程在同時執(zhí)行惭婿。
通過下圖來區(qū)別單線程程序與多線程程序的不同:
? 單線程程序:即,若有多個任務只能依次執(zhí)行叶雹。當上一個任務執(zhí)行結束后财饥,下一個任務開始執(zhí)行。如折晦,去網(wǎng)吧上網(wǎng)钥星,網(wǎng)吧只能讓一個人上網(wǎng),當這個人下機后满着,下一個人才能上網(wǎng)谦炒。
? 多線程程序:即贯莺,若有多個任務可以同時執(zhí)行。如宁改,去網(wǎng)吧上網(wǎng)缕探,網(wǎng)吧能夠讓多個人同時上網(wǎng)。

單線程和多線程區(qū)別.png

以下舉幾個模型圖


單線程程序.JPG
迅雷下載線程原理.JPG

程序在電腦中運行原理
? 分時調(diào)度
所有線程輪流使用 CPU 的使用權还蹲,平均分配每個線程占用 CPU 的時間爹耗。
? 搶占式調(diào)度
優(yōu)先讓優(yōu)先級高的線程使用 CPU,如果線程的優(yōu)先級相同谜喊,那么會隨機選擇一個(線程隨機性)潭兽,Java使用的為搶占式調(diào)度。

實際上锅论,CPU(中央處理器)使用搶占式調(diào)度模式在多個線程間進行著高速的切換讼溺。對于CPU的一個核而言楣号,某個時刻最易,只能執(zhí)行一個線程,而 CPU的在多個線程間切換速度相對我們的感覺要快炫狱,看上去就是在同一時刻運行藻懒。
其實,多線程程序并不能提高程序的運行速度视译,但能夠提高程序運行效率嬉荆,讓CPU的使用率更高。

主線程

:jvm啟動后酷含,必然有一個執(zhí)行路徑(線程)從main方法開始的鄙早,一直執(zhí)行到main方法結束,這個線程在java中稱之為主線程椅亚。當程序的主線程執(zhí)行時限番,如果遇到了循環(huán)而導致程序在指定位置停留時間過長,則無法馬上執(zhí)行下面的程序呀舔,需要等待循環(huán)結束后能夠執(zhí)行弥虐。
那么,能否實現(xiàn)一個主線程負責執(zhí)行其中一個循環(huán)媚赖,再由另一個線程負責其他代碼的執(zhí)行霜瘪,最終實現(xiàn)多部分代碼同時執(zhí)行的效果?
能夠實現(xiàn)同時執(zhí)行惧磺,通過Java中的多線程技術來解決該問題颖对。

主線程.JPG

Thread類
Java虛擬機允許應用程序同時執(zhí)行多個執(zhí)行線程。 每個線程都有優(yōu)先權磨隘。 具有較高優(yōu)先級的線程優(yōu)先于優(yōu)先級較低的線程執(zhí)行缤底。 每個線程可能也可能不會被標記為守護程序布讹。 當在某個線程中運行的代碼創(chuàng)建一個新的Thread對象時,新線程的優(yōu)先級最初設置為等于創(chuàng)建線程的優(yōu)先級训堆,并且當且僅當創(chuàng)建線程是守護進程時才是守護線程描验。

當Java虛擬機啟動時,通常有一個非守護進程線程(通常調(diào)用某些指定類的名為main的方法)坑鱼。 Java虛擬機將繼續(xù)執(zhí)行線程膘流,直到發(fā)生以下任一情況:

已經(jīng)調(diào)用了Runtime類的exit方法,并且安全管理器已經(jīng)允許進行退出操作鲁沥。
所有不是守護進程線程的線程都已經(jīng)死亡呼股,無論是從調(diào)用返回到run方法還是拋出超出run方法的run 。
創(chuàng)建一個新的執(zhí)行線程有兩種方法画恰。 一個是將一個類聲明為Thread的子類彭谁。 這個子類應該重寫run類的方法Thread 。 然后可以分配并啟動子類的實例允扇。 例如缠局,計算大于規(guī)定值的素數(shù)的線程可以寫成如下:


 class PrimeThread extends Thread {
     long minPrime;
     PrimeThread(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
        System.out.println("我是一個新線程");
     }
 }

然后,以下代碼將創(chuàng)建一個線程并啟動它運行:

 PrimeThread p = new PrimeThread(143);
 p.start();

Thread類的方法摘要

QQ截圖20170812204217.png

思考:線程對象調(diào)用 run方法和調(diào)用start方法區(qū)別考润?
線程對象調(diào)用run方法不開啟線程狭园。僅是對象調(diào)用方法。線程對象調(diào)用start開啟線程糊治,并讓jvm調(diào)用run方法在開啟的線程中執(zhí)行唱矛。

創(chuàng)建線程的目的是什么?
是為了建立程序單獨的執(zhí)行路徑井辜,讓多部分代碼實現(xiàn)同時執(zhí)行绎谦。也就是說線程創(chuàng)建并執(zhí)行需要給定線程要執(zhí)行的任務。
對于之前所講的主線程粥脚,它的任務定義在main函數(shù)中窃肠。自定義線程需要執(zhí)行的任務都定義在run方法中。
Thread類run方法中的任務并不是我們所需要的阿逃,只有重寫這個run方法铭拧。既然Thread類已經(jīng)定義了線程任務的編寫位置(run方法),那么只要在編寫位置(run方法)中定義任務代碼即可恃锉。所以進行了重寫run方法動作搀菩。

package cn.itcast.demo;
/*
 * 創(chuàng)建和啟動一個線程
 *    創(chuàng)建Thread子類對象
 *    子類調(diào)用方法start();注意:不能調(diào)用子類run()方法,
 *    子類調(diào)用run()方法并不開啟線程,只能調(diào)用start方法開啟線程,
 *    jvm會調(diào)用run方法在開啟的線程中執(zhí)行
 *    
 *    讓線程程序執(zhí)行  虛擬機調(diào)用線程中的run
 *   
 */
public class ThreadDemo {
       
      public static void main(String[] args) {
        SubThread st = new SubThread();
        st.start(); 
        for(int i =  0;i<50;i++)
        {
            System.out.println("Main......"+i);
        }               
    }   
}


package cn.itcast.demo;
/*
 * 定義子類 繼承Thread
 * 重寫方法run
 */
public class SubThread extends Thread {
 
      public void run() {
          for (int i = 0; i < 50; i++) {
            System.out.println("run...."+i);
        }
      }  
}

獲取線程的名字

Thread類提供一個getName()用于返回線程的名字,currentThread(),返回主線程的名字

package cn.itcast.demo1;

import java.util.TreeSet;

public class NameThread extends Thread{

    @Override
    public void run() {
        System.out.println(super.getName());
    }
}

package cn.itcast.demo1;
/*
 * JVM開啟主線程,運行方法main,主線程也是線程,是線程就必然是Thread類的對象
 * Thread類中,靜態(tài)方法
 * static Thread currentThread()返回正在執(zhí)行的線程對象
 */
public class ThreadDemo {

    public static void main(String[] args) {
        
        NameThread t = new NameThread();
        t.start();
        Thread t2 = Thread.currentThread();
        System.out.println(t2.getName());                       
    }

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市破托,隨后出現(xiàn)的幾起案子肪跋,更是在濱河造成了極大的恐慌,老刑警劉巖土砂,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件州既,死亡現(xiàn)場離奇詭異谜洽,居然都是意外死亡,警方通過查閱死者的電腦和手機吴叶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門阐虚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚌卤,你說我怎么就攤上這事实束。” “怎么了逊彭?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵咸灿,是天一觀的道長。 經(jīng)常有香客問我侮叮,道長避矢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任囊榜,我火速辦了婚禮审胸,結果婚禮上,老公的妹妹穿的比我還像新娘锦聊。我一直安慰自己歹嘹,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布孔庭。 她就那樣靜靜地躺著,像睡著了一般材蛛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天拢操,我揣著相機與錄音丙躏,去河邊找鬼。 笑死豆赏,一個胖子當著我的面吹牛挣菲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掷邦,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼白胀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抚岗?” 一聲冷哼從身側響起或杠,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宣蔚,沒想到半個月后向抢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體认境,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年挟鸠,在試婚紗的時候發(fā)現(xiàn)自己被綠了叉信。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡艘希,死狀恐怖茉盏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枢冤,我是刑警寧澤鸠姨,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站淹真,受9級特大地震影響讶迁,放射性物質發(fā)生泄漏。R本人自食惡果不足惜核蘸,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一巍糯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧客扎,春花似錦祟峦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袱吆,卻和暖如春厌衙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绞绒。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工婶希, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓬衡。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓喻杈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狰晚。 傳聞我的和親對象是個殘疾皇子筒饰,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

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

  • 又來到了一個老生常談的問題,應用層軟件開發(fā)的程序員要不要了解和深入學習操作系統(tǒng)呢家肯? 今天就這個問題開始龄砰,來談談操...
    tangsl閱讀 4,124評論 0 23
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞换棚、線程狀態(tài)及相應的一些線程函數(shù)用法式镐、概述等。 首先講...
    李欣陽閱讀 2,454評論 1 15
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,957評論 1 18
  • 該文章轉自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍閱讀 7,353評論 3 87
  • 文/伶霏 讓心撒個歡固蚤, 讓味蕾跑個龍?zhí)住?看彩虹安住在藍底浮云雕之間娘汞, 不絕于耳的風呼嘯著奔向終點。 氣泡夕玩,霓虹你弦,...
    伶霏閱讀 222評論 0 1