1. 程式人生 > >join和yield 等待執行緒結束(join)和謙讓(yield)

join和yield 等待執行緒結束(join)和謙讓(yield)

        在很多情況下,執行緒之間的協作和人與人之間的協作非常類似。一種非常常見的合作方式,就是分工合作,以我們非常熟悉的軟體開發為例,在一個專案進行時,總是應該有幾位號稱是“需求分析師”的同事,先對系統的需求和功能點進行整理和總結,然後,以書面形式給出-份需求說明或者類似的參考文件,然後,軟體設計師、研發工程師才會一擁而上,進行軟體開發。如果缺少需求分析師的工作輸出,那麼軟體研發的難度可能會比較大。因此,作為一名軟,件研發人員,總是喜歡等待需求分析師完成他應該完成的任務後,才願意投身工作。簡單地說,就是研發人員需要等待需求分析師完成他的工作,然後,才能進行研發。

        將這個關係對應到多執行緒應用中,很多時候,一個執行緒的輸入可能非常依賴於另外一個或者多個執行緒的輸出,此時,這個執行緒就需要等待依賴執行緒執行完畢,才能繼續執行。JDK提供了join()操作來實現這個功能,如下所示,顯示了2個join()方法;

    public final void join() throws InterruptedException
    
    public final synchronized void join(long millis) throws InterruptedException  

第一個join()方法表示無限等待,它會一直阻塞當前執行緒,直到目標執行緒執行完畢。第二個方法給出了一個最大等待時間,如果超過給定時間目標執行緒還在執行,當前執行緒也會因為“等不及了",而繼續往下執行。

英文join的翻譯,通常是加入的意思,在這裡感覺也非常貼切,因為一個執行緒要加入另外一個執行緒,那麼最好的方法就是等著它一起走.

這裡提供一個簡單點的join()例項,供大家參考:

public class JoinMain {

    public volatile static int i = 0;
    publie

    static class AddThread extends Thread {

        @override
        public void run( 
	for(i=0;i<10000000;i++);
    }

    public static void main(String(]args) throws InterruptedException {
        Addrhread at -new AddThread();
        at.start();
        at.join();
        System.out.printin(i):
    }

}

        主函式中,如果不使用join()等待AddThread,那麼得到的i很可能是0或者一個非常小的數字。因為AddThread還沒開始執行, i的值就已經被輸出了。但在使用ioin()方法後,表示主執行緒願意等待AddThread執行完畢,跟著AddThread一起往前走,故在join()返回時, AddThread已經執行完成,故i總是10000000.

        有關ioin(),我還想再補充一點, ioin()的本質是讓呼叫執行緒wait)在當前執行緒物件例項上。下面是JDK中ioin()實現的核心程式碼片段:

while(isAlive()){
    wait(0);
}

        可以看到,它讓呼叫執行緒在當前執行緒物件上進行等待。當執行緒執行完成後,被等待的執行緒會在退出前呼叫notifvAll0通知所有的等待執行緒繼續執行。因此,值得注意的一點是:不要在應用程式中,在Thread物件例項上使用類似wait)或者notifv0等方法,因為這很有可能會影響至統API的工作,或者被系統API所影響。

        另外一個比較有趣的方法,是Thread.yield0),它的定義如下:

public static native void yield();

這是一個靜態方法,一旦執行,它會使當前執行緒讓出CPU,但要注意,讓出CPU並不表示當前執行緒不執行了。當前執行緒在讓出CPU後,還會進行CPU資源的爭奪,但是是否能夠國次被分配到,就不一定了。因此,對Thread.yieldo的呼叫就好像是在說:我已經完成一些最面要的工作了,我應該是可以休息一下了,可以給其他執行緒一些工作機會啦!

如果你覺得一個執行緒不那麼重要,或者優先順序非常低,而且又害怕它會佔用太多的CPU源,那麼可以在適當的時候呼叫Thread.yield(),給予其他重要執行緒更多的工作機會。

摘自:《實戰Java高併發程式設計》葛一鳴 郭超 著

相關推薦

joinyield 等待執行結束(join)謙讓(yield)

        在很多情況下,執行緒之間的協作和人與人之間的協作非常類似。一種非常常見的合作方式,就是分工合作,以我們非常熟悉的軟體開發為例,在一個專案進行時,總是應該有幾位號稱是“需求分析師”的同事,先對系統的需求和功能點進行整理和總結,然後,以書面形式給出-份需求說明或者

No6.等待執行結束join通知(notify)

先看 join例子: public class JoinMain { public volatile static int i = 0; public static class AddTh

Windows10 VS2017 C++多執行傳參等待執行結束

#include "pch.h" #include <iostream> #include <windows.h> using namespace std; typedef struct MyData { const char* str; }MYDATA;

Java高併發--等待執行結束謙讓

針對本格專題我們主要討論join()和yield()這兩個方法。 一、等待執行緒結束 如果我們想要在一個執行緒中獲取到另外一個執行緒的處理結果,那麼 這個時候我們該怎麼辦呢?最好的方式當然就是等待另一個執行緒的結束後再來執行當前執行緒,這個時候就該我們的join()方法上場

等待執行結束

等待執行緒結束 準備工作 實現過程 工作原理 擴充套件學習 在某些時候,我們需要等待執行緒執行結束(run()方法結束其執行)。例如,在開始其他任務執行之前,程式首先要初始化所需資源。我們可以用執行緒來初始化任務,直到初始化結束後,再執行

WIN32多執行二 用WaitXXX函式等待執行結束

 等待執行緒結束的更好方法是呼叫API WaitForSigleObject和WaitForMultipleObjects。前者用於等待一個執行緒由未激發狀態變為激發狀態,後者用於等待多個執行緒中全部或多箇中的一個由未激發狀態變為激發狀態。對執行緒核心物件而言,如果執行

Java併發程式設計之執行生命週期、守護執行、優先順序join、sleep、yield

Java併發程式設計中,其中一個難點是對執行緒生命週期的理解,和多種執行緒控制方法、執行緒溝通方法的靈活運用。這些方法和概念之間彼此聯絡緊密,共同構成了Java併發程式設計基石之一。 Java執行緒的生命週期 Java執行緒類定義了New、Runnable、Running Man、Blocked和Dead

Java Thread.join()詳解--父執行等待執行結束後再結束

一、使用方式。 join是Thread類的一個方法,啟動執行緒後直接呼叫,例如: ? 1 Thread t = new AThread(); t.start(); t.join();

執行joinyield

/*  * 一.join:  * 當A執行緒執行到了b執行緒的join方法時,A執行緒就會等待,等B現成都執行完,A才會執行。  * join可一用來臨時加入執行緒執行。  *二. toString

執行joinyield

join()方法的理解 這是官方文件的註釋: /** * Waits for this thread to die. * * <p> An invocation of this method behaves in exactly the s

python執行joinsetDaemon

join([timeout]) 主執行緒A中,建立子執行緒B,B呼叫join函式會使得主執行緒阻塞,直到子執行緒執行結束或超時。引數timeout是一個數值型別,用來表示超時時間,如果未提供該引數,那麼主調執行緒將一直阻塞直到子執行緒結束。 注意:必須在start() 方法呼叫之後設

【Java多執行併發總結】Thread類的常用方法(joinyield等)---執行的基礎操作篇

 啟動(start)   最基本的操作,呼叫Runnable中的run方法,無返回值。 new Thread(new Test()).start(); 休眠(sleep)  使當前執行緒休眠一段時間,預設為毫秒級,最高可以精確到納秒,呼叫的方法為slee

Python多執行的理解使用(一)Threading中join()函式的理解

1. 多執行緒的概念 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度  程式的執行速

java多執行—Thread.Join()Thread.Sleep()

其實我想要   一種美夢睡不著   一種心臟的狂跳   瓦解界線不被撂倒 奔跑 依靠   我心中最想要   看你看過的浪潮   陪你放肆地年少   ——林俊杰【偉大的渺小】 ------------

【多執行】——joinyield、wait、sleep的區別

join    通常由使用執行緒的程式呼叫,將大問題劃分為許多小問題,每個小問題分配一個執行緒,當所有小問題都得到處理後,再呼叫主執行緒進一步操作。 join(); Join(long mi

執行joindetach方法的理解

thread.Join把指定的執行緒加入到當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。比如線上程B中呼叫了執行緒A的Join()方法,直到執行緒A執行完畢後,才會繼續執行執行緒B。 join是阻塞當前執行緒,並等待object對應執行緒結束,

執行-join方法(主執行等待執行執行完畢)

多執行緒中的join方法 join主要的作用就是讓主執行緒 等待 子執行緒 執行完畢之後,才讓主執行緒繼續執行。 話不多說,直接看程式碼例子就好。 父執行緒 package com.luoy.Thread.join; public class Fa

WindowsLinux上分別怎樣實現等待某個執行結束?---用WaitForSingleObjectpthread_join

     Windows和Linux上分別怎樣實現等待某個執行緒結束呢, 我們先看Windows的情形, 直接上程式碼: #include <windows.h> #include &l

【原】對多執行中WaitJoin的理解

對於,wait方法的解釋,有時候覺得很矛盾。呼叫某個物件的wait時,需要獲得該物件的鎖,在執行的時候又需要釋放該物件的所有鎖。這是問題一。 另外,在看Join的原始碼,會發現它利用了Wait來實現,但是它的實現原理是怎樣的呢? 這是問題二。 看下原始碼的英文描述:

執行join detach狀態

在任何一個時間點上,執行緒是可結合的(joinable),或者是分離的(detached)。一個可結合的執行緒能夠被其他執行緒收回其資源和殺死;在被其他執行緒回收之前,它的儲存器資源(如棧)是不釋放的。相反,一個分離的執行緒是不能被其他執行緒回收或殺死的,它的儲存器資源在