前のセクションと同様に、Python の threading.Thread クラスには、スレッドの関数を定義するために使用される run メソッドがあります。このメソッドは独自のスレッド クラスでオーバーライドできます。独自のスレッド インスタンスを作成した後、Thread クラスの start メソッドを使用してスレッドを開始し、スケジュールのためにスレッドを Python 仮想マシンに渡すことができます。スレッドが実行できるようになると、run メソッドが呼び出されて実行されます。糸。最初の例から始めましょう:
# encoding: UTF-8
import threading
import time
class MyThread(threading.Thread):
def run(self):
for i in range(3):
time.sleep(1)
msg = "I'm "+self.name+' @ '+str(i)
print msg
def test():
for i in range(5):
t = MyThread()
t.start()
if __name__ == '__main__':
test()
ログイン後にコピー
実行結果:
I'm Thread-1 @ 0
I'm Thread-2 @ 0
I'm Thread-5 @ 0
I ' m Thread-3 @ 0
私は Thread-4 @ 0
私は Thread-3 @ 1
私は Thread-4 @ 1
私は Thread-5 @ 1
I ' m Thread-1 @ 1
私は Thread-2 @ 1
私は Thread-4 @ 2
私は Thread-5 @ 2
私は Thread-2 @ 2
I ' m Thread-1 @ 2
I'm Thread-3 @ 2
コードと実行結果から、マルチスレッドプログラムの実行順序は不確実であることがわかります。 sleep ステートメントが実行されると、スレッドはブロックされます (Blocked)。スリープが終了すると、スレッドは準備完了 (Runnable) 状態になり、スケジューリングを待ちます。スレッドのスケジューリングにより、実行するスレッドが選択されます。上記のコードは、各スレッドが run 関数全体を実行することを保証することしかできませんが、スレッドの起動順序や run 関数内の各ループの実行順序を決定することはできません。
さらに、次の点にも注意してください:
1. 各スレッドには名前が必要です。上記の例ではスレッド オブジェクトの名前が指定されていませんが、Python は自動的にスレッドに名前を割り当てます。
2. run() メソッドが終了すると、スレッドが完了します。
3. スレッド スケジューラは制御できませんが、スレッド スケジューリング方法は他の方法で影響を受ける可能性があります。
上記の例は、スレッドの作成、アクティブな一時停止、スレッドの終了を簡単に示しています。次のセクションでは、ミューテックス ロックを使用したスレッドの同期について説明します。