Java線程知識

Java線程知識

進程是是線程的集合,線程是進程的一條執(zhí)行路徑。(進程就是一個運行的應用程序纺念,使用多線程主要是為了提高程序效率)

創(chuàng)建多線程方法:繼承Thread、實現(xiàn)Runnable想括、匿名內(nèi)部類(new Runnable())陷谱,都是將需要在線程運行的代碼放在run() 方法下。

多線程每個線程運行互不影響主胧。

一般使用實現(xiàn)Runnable方式比繼承Thread方式創(chuàng)建線程好叭首,因為如果的你的類繼承了Thread就不能繼承其他類了习勤,但是一個類可以實現(xiàn)多個接口

守護線程和用戶線程(非守護線程)

Java有兩種線程:用戶線程,守護線程焙格。用戶線程指的是自己定義的線程图毕,主線程停止了用戶線程不會停止,守護線程值得是當進程不存在或主線程停止眷唉,守護線程也會被停止予颤。比如用于垃圾回收的gc線程為守護線程。使用setDaenmon(true)可以將非守護線程設(shè)置為守護線程冬阳。

多線程運行狀態(tài)


?線程從創(chuàng)建蛤虐、運行到結(jié)束總是處于下面五個狀態(tài)之一:新建狀態(tài)、就緒狀態(tài)肝陪、運行狀態(tài)驳庭、阻塞狀態(tài)及死亡狀態(tài)。

新建狀態(tài)

???當用new操作符創(chuàng)建一個線程時氯窍, 例如new Thread(r)饲常,線程還沒有開始運行,此時線程處在新建狀態(tài)狼讨。 當一個線程處于新生狀態(tài)時贝淤,程序還沒有開始運行線程中的代碼

就緒狀態(tài)

一個新創(chuàng)建的線程并不自動開始運行,要執(zhí)行線程政供,必須調(diào)用線程的start()方法播聪。當線程對象調(diào)用start()方法即啟動了線程,start()方法創(chuàng)建線程運行的系統(tǒng)資源布隔,并調(diào)度線程運行run()方法离陶。當start()方法返回后,線程就處于就緒狀態(tài)执泰。

?????處于就緒狀態(tài)的線程并不一定立即運行run()方法枕磁,線程還必須同其他線程競爭CPU時間,只有獲得CPU時間才可以運行線程术吝。因為在單CPU的計算機系統(tǒng)中计济,不可能同時運行多個線程,一個時刻僅有一個線程處于運行狀態(tài)排苍。因此此時可能有多個線程處于就緒狀態(tài)沦寂。對多個處于就緒狀態(tài)的線程是由Java運行時系統(tǒng)的線程調(diào)度程序(thread scheduler)來調(diào)度的。

運行狀態(tài)

當線程獲得CPU時間后淘衙,它才進入運行狀態(tài)传藏,真正開始執(zhí)行run()方法.

阻塞狀態(tài)

?線程運行過程中,可能由于各種原因進入阻塞狀態(tài):

1>線程通過調(diào)用sleep方法進入睡眠狀態(tài);

2>線程調(diào)用一個在I/O上被阻塞的操作毯侦,即該操作在輸入輸出操作完成之前不會返回到它的調(diào)用者哭靖;

3>線程試圖得到一個鎖,而該鎖正被其他線程持有侈离;

4>線程在等待某個觸發(fā)條件试幽;

死亡狀態(tài)

有兩個原因會導致線程死亡:

1) run方法正常退出而自然死亡,

2)一個未捕獲的異常終止了run方法而使線程猝死卦碾。為了確定線程在當前是否存活著(就是要么是可運行的铺坞,要么是被阻塞了),需要使用isAlive方法洲胖。如果是可運行或被阻塞济榨,這個方法返回true;如果線程仍舊是new狀態(tài)且不是可運行的绿映, 或者線程死亡了擒滑,則返回false.

join()使用方法

join()作用是讓其他線程變?yōu)榈却瑃1是一個線程叉弦,t1.join()讓其他線程變?yōu)榈却俪溃钡疆斍皌1線程執(zhí)行完畢,才會釋放卸奉。如果在t2線程中調(diào)用了t1.join()方法,表示t1線程結(jié)束后才會開始執(zhí)行t2線程颖御,此時t2線程處于阻塞狀態(tài)榄棵。原理:

public final synchronized void join(long millis)

? ? throws InterruptedException {

? ? ? ? long base = System.currentTimeMillis();

? ? ? ? long now = 0;

? ? ? ? if (millis < 0) {

? ? ? ? ? ? throw new IllegalArgumentException("timeout value is negative");

? ? ? ? }

? ? ? ? if (millis == 0) {

? ? ? ? ? ? while (isAlive()) {

? ? ? ? ? ? ? ? wait(0);

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? while (isAlive()) {

? ? ? ? ? ? ? ? long delay = millis - now;

? ? ? ? ? ? ? ? if (delay <= 0) {

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? wait(delay);

? ? ? ? ? ? ? ? now = System.currentTimeMillis() - base;

? ? ? ? ? ? }

? ? ? ? }

? ? }

在t2中調(diào)用t1的join方法會調(diào)用t1的wait()方法,當t1線程結(jié)束(或者到達等待時間)潘拱,t1會調(diào)用notifyAll方法喚醒t2線程疹鳄。

優(yōu)先級

現(xiàn)代操作系統(tǒng)基本采用時分的形式調(diào)度運行的線程,線程分配得到的時間片的多少決定了線程使用處理器資源的多少芦岂,也對應了線程優(yōu)先級這個概念瘪弓。在JAVA線程中,通過一個int priority來控制優(yōu)先級禽最,范圍為1-10腺怯,其中10最高,默認值為5川无。下面是源碼(基于1.8)中關(guān)于priority的一些量和方法呛占。


class PrioritytThread implements Runnable {

?

????? public void run() {

?????????? for (int i = 0; i < 100; i++) {

???????????????? System.out.println(Thread.currentThread().toString()? +"---i:" + i);

?????????? }

????? }

}

?

public class ThreadDemo4 {

?

????? public static void main(String[] args) {

?????????? PrioritytThreadprioritytThread = new PrioritytThread();

?????????? Threadt1 = new Thread(prioritytThread);

?????????? Threadt2 = new Thread(prioritytThread);

?????????? t1.start();

?????????? // 注意設(shè)置了優(yōu)先級, 不代表每次都一定會被執(zhí)行懦趋。 只是CPU調(diào)度會有限分配

?????????? t1.setPriority(10);

?????????? t2.start();

??????????

????? }

?

}

?

Yield方法


Thread.yield()方法的作用:暫停當前正在執(zhí)行的線程晾虑,并執(zhí)行其他線程。(可能沒有效果)

yield()讓當前正在運行的線程回到可運行狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行的機會帜篇。因此糙捺,使用yield()的目的是讓具有相同優(yōu)先級的線程之間能夠適當?shù)妮啌Q執(zhí)行。但是笙隙,實際中無法保證yield()達到讓步的目的洪灯,因為,讓步的線程可能被線程調(diào)度程序再次選中逃沿。

結(jié)論:大多數(shù)情況下婴渡,yield()將導致線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),但有可能沒有效果凯亮。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末边臼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子假消,更是在濱河造成了極大的恐慌柠并,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富拗,死亡現(xiàn)場離奇詭異臼予,居然都是意外死亡,警方通過查閱死者的電腦和手機啃沪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門粘拾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人创千,你說我怎么就攤上這事缰雇。” “怎么了追驴?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵械哟,是天一觀的道長。 經(jīng)常有香客問我殿雪,道長暇咆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任丙曙,我火速辦了婚禮爸业,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘河泳。我一直安慰自己沃呢,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布拆挥。 她就那樣靜靜地躺著薄霜,像睡著了一般某抓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惰瓜,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天否副,我揣著相機與錄音,去河邊找鬼崎坊。 笑死备禀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奈揍。 我是一名探鬼主播曲尸,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼男翰!你這毒婦竟也來了另患?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蛾绎,失蹤者是張志新(化名)和其女友劉穎昆箕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體租冠,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鹏倘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了顽爹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纤泵。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镜粤,靈堂內(nèi)的尸體忽然破棺而出夕吻,到底是詐尸還是另有隱情,我是刑警寧澤繁仁,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站归园,受9級特大地震影響黄虱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜庸诱,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一捻浦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桥爽,春花似錦朱灿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪楞。三九已至,卻和暖如春侣灶,著一層夾襖步出監(jiān)牢的瞬間甸祭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工褥影, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留池户,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓凡怎,卻偏偏與公主長得像校焦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子统倒,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評論 1 18
  • 本文主要講了java中多線程的使用方法寨典、線程同步、線程數(shù)據(jù)傳遞檐薯、線程狀態(tài)及相應的一些線程函數(shù)用法凝赛、概述等。 首先講...
    李欣陽閱讀 2,442評論 1 15
  • 類 定義和C++一樣坛缕,都需要類的聲明和實現(xiàn)墓猎,而且頭文件進行類聲明,.m文件類的實現(xiàn)赚楚。類在@interface和@e...
    龍馬君閱讀 244評論 0 0
  • “學會了依戀的人毙沾,他會擁抱真實世界;而一直停留在自戀中的人宠页,容易呆在自己的世界中左胞,并認為自己的世界才是精神的歸宿。...
    城市格調(diào)劉姣閱讀 212評論 0 0
  • ios系統(tǒng)平臺上的APP交互設(shè)計稿的尺寸举户,就按照iPhone6的尺寸來做烤宙。 尺寸大小如下:750*1334px 詳...
    luke_uk閱讀 1,369評論 0 1