1. Thread クラスを継承するクラスを定義し、クラス内の run メソッドをオーバーライドし、クラス オブジェクトの start メソッドを呼び出します。start メソッドはスレッドを開始し、run メソッドを呼び出します。 Thread クラスはスレッドを記述するために使用されます。このクラスは、スレッドによって実行されるコードを格納するために使用される関数 run を定義します。
2. Runnable インターフェイスを実装するクラスを定義し、Runnable インターフェイスのメソッドをオーバーライドし、Thread クラスを通じてスレッド オブジェクトを作成し、Runnable インターフェイスのサブクラス オブジェクトを実パラメータとして Thread クラスのコンストラクターに渡し、呼び出します。スレッドを開始するための Thread クラスの start メソッド。Runnable インターフェイス サブクラスの run メソッドが呼び出されます。
Runnable インターフェイスを実装する方法により、単一継承によって引き起こされる制限が回避されます。
スレッド T;
T.setMaemon(true);// スレッドをバックグラウンド スレッドとして設定します。バックグラウンド スレッドは、すべてのフォアグラウンド スレッドが終了すると自動的に終了します。
T.notify();//このスレッドを起動します。
T.notifyAll();//すべてのスレッドを起動します。
T.interrupt();//スレッドを中断します。
Thread.sleep(100);//スレッドを 100 ミリ秒間一時停止します
synchronized:デフォルトでは、それ自体がロックされ、カスタム オブジェクトもロックできます。
複数のスレッドが同じロックを使用する必要があります。同期プロセス中は 1 つのスレッドだけが実行されるようにする必要があります。
同期の決定:どのコードがマルチスレッド実行を必要とするかを明確にし、共有データを明確にし、マルチスレッド実行コード内のどのステートメントが共有データを操作するかを明確にします。
Tickets クラスは Runnable を実装します
{
プライベート int ティック = 100;
public void run() { // public synchronized void run()
while (ティック > 0) {
同期された (これ) {
if (ティック > 0) {
試す {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.toString() + "セール:" + check--);
}
}
}
}
上記のとおり、ティックは共有データであり、チケット自体を同期して操作する必要があります。
待機中のウェイクアップ メカニズム:同期スレッドを操作する場合、同期スレッドは、操作するスレッドが保持しているロックを識別する必要があります。同じロック上の通知によってウェイクアップできるのは、同じロック上の待機中のスレッドのみです。別のロックのスレッドはウェイクアップできません。 ; (つまり、待機と起動は同じロックでなければなりません)