1. 程式人生 > >多執行緒程式設計中的join函式

多執行緒程式設計中的join函式

# coding: utf-8
# 測試多執行緒中join的功能
import threading, time  
def doWaiting():  
    print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"  
    time.sleep(3)  
    print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" 
def doWaiting1():  
    print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"   
    time.sleep(8)  
    print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n"  
tsk = []    
thread1 = threading.Thread(target = doWaiting)  
thread1.start()  
tsk.append(thread1)
thread2 = threading.Thread(target = doWaiting1)  
thread2.start()  
tsk.append(thread2)
print 'start join: ' + time.strftime('%H:%M:%S') + "\n"   
for tt in tsk:
    tt.join()
print 'end join: ' + time.strftime('%H:%M:%S') + "\n"

Join的作用是眾所周知的,阻塞程序直到執行緒執行完畢

這個小程式使用了兩個執行緒thread1和thread2,執行緒執行的動作分別是doWaiting()和doWaiting1(),函式體就是列印「開始」+休眠3秒+列印「結束」,分別附加上時間用來檢視程式執行的過程。後面用start()方法同步開始執行兩個執行緒。然後開始迴圈呼叫兩個執行緒的join()方法,在此之前和之後都會用print函式做好開始結束的標記。我們主要觀察for tt in tsk: tt.join()。

join()不帶引數的情況下,執行如下:

start waiting1: 22:54:09

start waiting2: 22:54:09

start join: 22:54:09

stop waiting1: 22:54:12

stop waiting2:  22:54:17

end join: 22:54:17


Process finished with exit code 0

可以看到,兩個執行緒並行執行,程序1在3s後結束,程序2在8s後結束,然後回到主程序,執行列印「end join」。

下面把引數設定成超時2s,即tt.join(2),執行如下:

start waiting1: 22:54:57

start waiting2: 22:54:57

start join: 22:54:57

stop waiting1: 22:55:00

end join: 22:55:01

stop waiting2:  22:55:05


Process finished with exit code 0

兩個執行緒開始併發執行,然後執行執行緒1的join(2),等執行緒1執行2s後就不管它了,執行執行緒2的join(2),等執行緒2執行2s後也不管它了(在此過程中執行緒1執行結束,列印執行緒1的結束資訊),開始執行主程序,列印「end join」。4s之後執行緒2執行結束。

總結一下:

1.join方法的作用是阻塞主程序(擋住,無法執行join以後的語句),專注執行多執行緒。

2.多執行緒多join的情況下,依次執行各執行緒的join方法,前頭一個結束了才能執行後面一個。

3.無引數,則等待到該執行緒結束,才開始執行下一個執行緒的join。

4.設定引數後,則等待該執行緒這麼長時間就不管它了(而該執行緒並沒有結束)。不管的意思就是可以執行後面的主程序了。

最後附上引數為2時的程式執行流程表,自己畫的orz,這樣看起來更好理解。

相關推薦

執行程式設計join函式

# coding: utf-8 # 測試多執行緒中join的功能 import threading, time def doWaiting(): print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n" t

【C/C++開發】執行程式設計join函式

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # codi

Qt 執行程式設計的物件執行函式執行執行

    為徹底搞清原因並解決問題,在查閱大量資料和Qt文件之後,理清了其中的機制,也對多執行緒程式設計中的QObject物件建立以及connect執行有更清楚的認識:     1. 一個物件的執行緒就是建立該物件時的執行緒,而不論該物件的定義是儲存在那個執行緒中;     2. QObject的connec

Java執行程式設計執行的同步與互斥/執行安全/Java鎖

摘要:多執行緒三個特徵:原子性、可見性以及有序性.>執行緒的同步與互斥?(同步執行緒與非同步執行緒,執行緒同步和非同步問題)  1.同步:假設現有執行緒A和執行緒B,執行緒A需要往緩衝區寫資料,執行緒B需要從緩衝區讀資料,但他們之間存在一種制約

java 執行程式設計join()的用法

join的用法,先看幾個例子在說。 程式1: public class ThreadTest implements Runnable {  public static int a = 0;  public synchronized void inc() {   a+

執行程式設計三個特性

多執行緒程式設計要確保併發程式正確地執行,必須要保證原子性、可見性以及有序性,缺一不可,不然就可能導致結果執行不正確。 1.原子性 即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 一個很經典的例子就是銀行賬戶轉賬問

執行程式設計daemon屬性的作用python

Python多執行緒程式設計中daemon屬性的作用 轉自:http://blog.csdn.net/dongfuguo/article/details/53899426 在指令碼執行過程中有一個主執行緒,若在主執行緒中建立了子執行緒,當主執行緒結束時根據子執行緒daemon屬性值的不同可能會發生下

Java執行程式設計Future模式的詳解

Java多執行緒程式設計中,常用的多執行緒設計模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不變模式和生產者-消費者模式等。這篇文章主要講述Future模式,關於其他多執行緒設計模式的地址如下: 關於其他多執行緒設

Java執行程式設計生產者-消費者模式的詳解

生產者-消費者模式是一個經典的多執行緒設計模式,它為多執行緒的協作提供了良好的解決方案。在生產者-消費者模式中,通常有兩類執行緒,即若干個生產者執行緒和若干個消費者執行緒。生產者執行緒負責提交使用者請求,消費者執行緒負責處理使用者請求。生產者和消費者之間通過共享記憶體緩衝區

Java執行程式設計Master-Worker模式的詳解

Java多執行緒程式設計中,常用的多執行緒設計模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不變模式和生產者-消費者模式等。這篇文章主要講述Master-Worker模式,關於其他多執行緒設計模式的地址如下: 關於

【併發】執行程式設計條件變數和虛假喚醒的討論

轉自:http://blog.csdn.net/puncha/article/details/8493862 From: http://siwind.iteye.com/blog/1469216 From:http://en.wikipedia.org/wiki/S

Java執行6 同步函式的鎖和同步程式碼塊的鎖的區別

同步程式碼塊的出現是解決了多執行緒的安全問題,但是它增加了程式碼的縮排層級,同時降低了效率(每次無論是不是對的鎖,每個路徑都要去判斷) 針對同步出現的這兩個問題,首先討論第一個。因此引出一個新的知識點———————— 同步函式 關於同步函式的使用(一買車票的程式碼為例子

Java執行程式設計不變模式的詳解

Java多執行緒程式設計中,常用的多執行緒設計模式包括:Future模式、Master-Worker模式、Guarded Suspeionsion模式、不變模式和生產者-消費者模式等。這篇文章主要講述不變模式,關於其他多執行緒設計模式的地址如下:關於Future模式的詳解:

執行程式設計的cmake

  我們在Linux上程式設計的時候,大部分時候都是利用cmake來完成我們的專案編譯。  那如果專案中遇到了多執行緒的pthread族函式,就要加上鍊接到pthread庫的標識,  在CMakeLi

每天進步一點點——論fork()函式與Linux執行程式設計

1. 雖然只將發起fork()呼叫的執行緒複製到子程序中,但全域性變數的狀態以及所有的pthreads物件(如互斥量、條件變數等)都會在子程序中得以保留,這就造成一個危險的局面。例如:一個執行緒在fork()被呼叫前鎖定了某個互斥量,且對某個全域性變數的更新也做到了一半,此時fork()被呼叫,所有資料及狀態

Java併發程式設計(8):執行環境安全使用集合API(含程式碼)

Java併發程式設計(8):多執行緒環境中安全使用集合API(含程式碼)JAVA大資料中高階架構 2018-11-09 14:44:47在集合API中,最初設計的Vector和Hashtable是多執行緒安全的。例如:對於Vector來說,用來新增和刪除元素的方法是同步的。如果只有一個執行緒與Vector的例

Python執行程式設計執行安全與鎖(一) 聊聊Python的GIL 聊聊Python的GIL python基礎之執行鎖機制 python--threading執行總結 Python3入門之執行threading常用方法

1. 多執行緒程式設計與執行緒安全相關重要概念 在我的上篇博文 聊聊Python中的GIL 中,我們熟悉了幾個特別重要的概念:GIL,執行緒,程序, 執行緒安全,原子操作。 以下是簡單回顧,詳細介紹請直接看聊聊Python中的GIL  GIL:&n

Oracle PLSQLl的執行程式設計架構 儲存過程使用執行 定時任務 作業排程計劃 JOB SCHEDULE

  基於Oracle plsql的多執行緒程式設計架構 (附儲存過程) 1年前 1413 作者介紹 馮守東,北京科訊華通科技發展有限公司高階專案經理。超12年Oracle開發及管理經驗,多年運營商和政府企業級系統運維經驗,曾獲得東軟最佳設計方案獎。熟悉Weblogic、TU

Java執行程式設計---面試

什麼是多執行緒 關鍵考點: a) 執行緒的概念。 b) 多執行緒的概念。 c) 多執行緒併發的含義。 答案: 執行緒是程序中的一個執行單元,又稱為輕量級程序,它和程序一樣擁有獨立的執行控制,由作業系統負責排程。 而多執行緒是這樣的一種機制:它允許在程式中併發

C++11執行程式設計 第十章: 使用packaged_task優雅的讓同步函式非同步執行

C++11 Multithreading – Part 10: packaged_task<> Example and Tutorial Varun July 2, 2017 C++11 Multithreading – Part 10: packaged_tas