国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java線程中yield與join方法的區(qū)別

瀏覽:9日期:2022-09-06 09:17:38

長期以來,多線程問題頗為受到面試官的青睞。雖然我個人認為我們當中很少有人能真正獲得機會開發(fā)復雜的多線程應用(在過去的七年中,我得到了一個機會),但是理解多線程對增加你的信心很有用。之前,我討論了一個wait()和sleep()方法區(qū)別的問題,這一次,我將會討論join()和yield()方法的區(qū)別。坦白的說,實際上我并沒有用過其中任何一個方法,所以,如果你感覺有不恰當?shù)牡胤剑執(zhí)岢鲇懻摗?/p>Java線程調度的一點背景

在各種各樣的線程中,Java虛擬機必須實現(xiàn)一個有優(yōu)先權的、基于優(yōu)先級的調度程序。這意味著Java程序中的每一個線程被分配到一定的優(yōu)先權,使用定義好的范圍內的一個正整數(shù)表示。優(yōu)先級可以被開發(fā)者改變。即使線程已經(jīng)運行了一定時間,Java虛擬機也不會改變其優(yōu)先級

優(yōu)先級的值很重要,因為Java虛擬機和下層的操作系統(tǒng)之間的約定是操作系統(tǒng)必須選擇有最高優(yōu)先權的Java線程運行。所以我們說Java實現(xiàn)了一個基于優(yōu)先權的調度程序。該調度程序使用一種有優(yōu)先權的方式實現(xiàn),這意味著當一個有更高優(yōu)先權的線程到來時,無論低優(yōu)先級的線程是否在運行,都會中斷(搶占)它。這個約定對于操作系統(tǒng)來說并不總是這樣,這意味著操作系統(tǒng)有時可能會選擇運行一個更低優(yōu)先級的線程。(我憎恨多線程的這一點,因為這不能保證任何事情)

注意Java并不限定線程是以時間片運行,但是大多數(shù)操作系統(tǒng)卻有這樣的要求。在術語中經(jīng)常引起混淆:搶占經(jīng)常與時間片混淆。事實上,搶占意味著只有擁有高優(yōu)先級的線程可以優(yōu)先于低優(yōu)先級的線程執(zhí)行,但是當線程擁有相同優(yōu)先級的時候,他們不能相互搶占。它們通常受時間片管制,但這并不是Java的要求。

理解線程的優(yōu)先權

接下來,理解線程優(yōu)先級是多線程學習很重要的一步,尤其是了解yield()函數(shù)的工作過程。

記住當線程的優(yōu)先級沒有指定時,所有線程都攜帶普通優(yōu)先級。優(yōu)先級可以用從1到10的范圍指定。10表示最高優(yōu)先級,1表示最低優(yōu)先級,5是普通優(yōu)先級。記住優(yōu)先級最高的線程在執(zhí)行時被給予優(yōu)先。但是不能保證線程在啟動時就進入運行狀態(tài)。與在線程池中等待運行機會的線程相比,當前正在運行的線程可能總是擁有更高的優(yōu)先級。由調度程序決定哪一個線程被執(zhí)行。t.setPriority()用來設定線程的優(yōu)先級。記住在線程開始方法被調用之前,線程的優(yōu)先級應該被設定。你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY來設定優(yōu)先級

現(xiàn)在,當我們對線程調度和線程優(yōu)先級有一定理解后,讓我們進入主題。

yield()方法

理論上,yield意味著放手,放棄,投降。一個調用yield()方法的線程告訴虛擬機它樂意讓其他線程占用自己的位置。這表明該線程沒有在做一些緊急的事情。注意,這僅是一個暗示,并不能保證不會產(chǎn)生任何影響。

在Thread.java中yield()定義如下:

/** * A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore * this hint. Yield is a heuristic attempt to improve relative progression between threads that would otherwise over-utilize a CPU. * Its use should be combined with detailed profiling and benchmarking to ensure that it actually has the desired effect. */public static native void yield();

讓我們列舉一下關于以上定義重要的幾點:

Yield是一個靜態(tài)的原生(native)方法Yield告訴當前正在執(zhí)行的線程把運行機會交給線程池中擁有相同優(yōu)先級的線程。Yield不能保證使得當前正在運行的線程迅速轉換到可運行的狀態(tài)它僅能使一個線程從運行狀態(tài)轉到可運行狀態(tài),而不是等待或阻塞狀態(tài)yield()方法使用示例

在下面的示例程序中,我隨意的創(chuàng)建了名為生產(chǎn)者和消費者的兩個線程。生產(chǎn)者設定為最小優(yōu)先級,消費者設定為最高優(yōu)先級。在Thread.yield()注釋和非注釋的情況下我將分別運行該程序。沒有調用yield()方法時,雖然輸出有時改變,但是通常消費者行先打印出來,然后事生產(chǎn)者。

調用yield()方法時,兩個線程依次打印,然后將執(zhí)行機會交給對方,一直這樣進行下去。

package test.core.threads;public class YieldExample{ public static void main(String[] args) { Thread producer = new Producer(); Thread consumer = new Consumer(); producer.setPriority(Thread.MIN_PRIORITY); //Min Priority consumer.setPriority(Thread.MAX_PRIORITY); //Max Priority producer.start(); consumer.start(); }}class Producer extends Thread{ public void run() { for (int i = 0; i < 5; i++) { System.out.println('I am Producer : Produced Item ' + i); Thread.yield(); } }}class Consumer extends Thread{ public void run() { for (int i = 0; i < 5; i++) { System.out.println('I am Consumer : Consumed Item ' + i); Thread.yield(); } }}上述程序在沒有調用yield()方法情況下的輸出:

I am Consumer : Consumed Item 0 I am Consumer : Consumed Item 1 I am Consumer : Consumed Item 2 I am Consumer : Consumed Item 3 I am Consumer : Consumed Item 4 I am Producer : Produced Item 0 I am Producer : Produced Item 1 I am Producer : Produced Item 2 I am Producer : Produced Item 3 I am Producer : Produced Item 4上述程序在調用yield()方法情況下的輸出:

I am Producer : Produced Item 0 I am Consumer : Consumed Item 0 I am Producer : Produced Item 1 I am Consumer : Consumed Item 1 I am Producer : Produced Item 2 I am Consumer : Consumed Item 2 I am Producer : Produced Item 3 I am Consumer : Consumed Item 3 I am Producer : Produced Item 4 I am Consumer : Consumed Item 4join()方法

線程實例的方法join()方法可以使得在另一個線程的執(zhí)行結束后再開始執(zhí)行這個線程。如果join()方法被在一個線程實例上調用,當前運行著的線程將阻塞直到線程實例完成了執(zhí)行。

//Waits for this thread to die.public final void join() throws InterruptedException

在join()方法內設定超時,使得join()方法的影響在特定超時后無效。當超時時,主方法和任務線程申請運行的時候是平等的。然而,當涉及sleep時,join()方法依靠操作系統(tǒng)計時,所以你不應該假定join()方法將會等待你指定的時間。

像sleep,join通過拋出InterruptedException對中斷做出回應。

join()方法使用示例

package test.core.threads;public class JoinExample{ public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { public void run() { System.out.println('First task started'); System.out.println('Sleeping for 2 seconds'); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('First task completed'); } }); Thread t1 = new Thread(new Runnable() { public void run() { System.out.println('Second task completed'); } }); t.start(); // Line 15 t.join(); // Line 16 t1.start(); }}Output:First task startedSleeping for 2 secondsFirst task completedSecond task completed

這是一些很小卻很重要的概念。在評論部分讓我知道你的想法。

標簽: Java
相關文章:
主站蜘蛛池模板: 一级毛片免费不卡在线视频 | a级一级黄色片 | 欧美国产日韩在线 | 国产在线不卡视频 | www.99精品 | 国产在线乱子伦一区二区 | 亚洲 欧美 日韩中文字幕一区二区 | 免费人成综合在线视频 | 亚洲视频在线观看网站 | 中文字幕在线无限2021 | 国产区香蕉精品系列在线观看不卡 | 99精品视频一区在线视频免费观看 | 久久怡红院国产精品 | 131的美女午夜爱爱爽爽视频 | 国产xh98hx在线观看 | 日本一在线中文字幕天堂 | 免费看岛国视频在线观看 | 国产欧美日韩在线一区二区不卡 | 99re热精品视频国产免费 | 在线观看视频亚洲 | 国内精品小视频在线 | 欧美成人看片一区二区三区尤物 | 日本不卡一二三 | 欧美性毛片大片 | 最新欧美一级视频 | 特级aaa片毛片免费观看 | 久久爱一区 | 日本二区免费一片黄2019 | 久久精品国产99久久香蕉 | 亚洲最大情网站在线观看 | chinese性老妇中国 | 国产精品免费综合一区视频 | 91成人在线视频 | 国产片18在线观看 | 三级网站 | 国产91精品露脸国语对白 | 亚洲成人免费网站 | 久久久久欧美精品网站 | 国产欧美日韩亚洲精品区2345 | 亚洲欧美日韩高清综合678 | 国产高清无专砖区2021 |