start.py代碼如下。相同的程序不同的線程輸出模塊
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
用python啓動它兩次。
python start.py
running in <myThread(mythrd, started 140461133485824)>
python start.py
running in <myThread(mythrd, started 140122860668672)>
run.py代碼如下。
import threading
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.run()
run.py只有一行不同於start.py。
現在啓動兩次run.py。
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
python run.py
running in <_MainThread(MainThread, started 139854546364160)>
startandrun.py代碼如下。
class myThread(threading.Thread):
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
def run(self):
currentThreadname = threading.currentThread()
print "running in ", currentThreadname
thread = myThread(1,"mythrd")
thread.start()
thread.run()
現在啓動兩次startandrun.py。
python startandrun.py
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
python startandrun.py
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
由於JohanL說:
當運行兩個獨立的線程,所有的賭注都關閉哪個會首先執行。
您基本上將調度離開到操作系統。 第一次執行startandrun.py,thread.start()
thread.run()
之前被執行,它導致輸出:
running in <myThread(mythrd, started 140317119899392)>
running in <_MainThread(MainThread, started 140317144454912)>
第二時間來執行startandrun.py,thread.start()
thread.run()
之後被執行,爲什麼不導致輸出:
running in <_MainThread(MainThread, started 140317144454912)>
running in <myThread(mythrd, started 140317119899392)>
,而不是
running in running in <_MainThread(MainThread, started 139980210505472)>
<myThread(mythrd, started 139980185949952)>
當運行兩個獨立的線程中,所有的賭注都關閉,以它將首先執行。您基本上將時間安排交給操作系統。這就是爲什麼當你的線程訪問相同的數據時你需要不同的同步原語(信號量,監視器等)。 – JohanL
'thread.run'不會啓動一個新線程,所以這段代碼可能不會做你認爲正在做的事。要開始一個線程,你需要調用'start'。你不應該直接調用'run','start'會爲你做。調用開始和運行只是爲了進一步混淆你試圖理解的任何問題。請參閱文檔,對此非常清楚:「創建線程對象後,必須通過調用線程的start()方法來啓動它的活動,然後在單獨的控制線程中調用run()方法。」 – pvg