Java高同時プログラム設計ノート(二)


スレッドの基本操作:
新規スレッド:start()とrun()の違い
start()は、スレッドを新規作成し、スレッドにrunメソッド()を実行させるコード(使用しない)run()は、現在のスレッドでrun()メソッドのコードをシリアル実行するだけです.
終了スレッド:stop()
stop()メソッドはあまりにも暴力的で、実行の半分に達したスレッドを強制的に終了させ、直ちにこのスレッドが持っているロックを解放します.これらのロックはデータオブジェクトの一貫性を維持するために使用されます.このとき、書き込みスレッドがデータの半分に書き込まれ、強制的に終了すると、オブジェクトは書き損じられ、同時にロックが解放されるため、もう1つのロックを待つスレッドがこのオブジェクトを読み取り、カップが発生します(使用しません)
割り込みスレッド:inerrupt()
中断メソッドinterrupt()を使用してstop()の代わりに、スレッド中断はスレッドをすぐに終了させるのではなく、ターゲットスレッドに終了を望んでいる人がいることを通知します.ターゲットスレッドが通知を受けた後にどのように処理するかは完全にターゲットスレッドが自分で決定することが重要であるThread 1=new Thread{
@override
public void run()
{
while(true)
{
if(Thread.currentThread().isInterrupt())
{
System.out.println("inerrupt!");
break;
}
Thread.yield();
}
}
};
wait()と通知notify()を待つ
この2つのメソッドはObject()クラスにあるので、いずれのオブジェクトもこの2つのメソッドを呼び出すことができます.例えば、Aスレッドでobj.wait()メソッドが呼び出されると、Aは実行の継続を停止して待機状態に移行する.他のスレッドがobj.notify()メソッドを呼び出すまで、objオブジェクトは複数のスレッド間の有効な通信手段として機能する.
wait()とnotify()はどのように働いていますか?1つのスレッドがobject.wait()を呼び出すと、objectオブジェクトの待機キューに入り、このキューには複数のスレッドがあります.object.notify()が呼び出されると、この待機キューからランダムにスレッドを選択し、起動します.この選択は不公平で、先に待機しているスレッドが優先されるわけではありません.この選択は完全にランダムです.注意:wait()とnotify()は勝手に呼び出されるものではなく、synchronized文に含める必要があります.
wait()とsleep()の違いは、wait()が起動できるほか、wait()メソッドがターゲットのロックを解放し、sleep()メソッドがリソースを解放しないことを除いて、スレッドをいくつかの時間待つことができます.
スレッド終了待ちjoin()と謙譲yield()
1つのスレッドの入力は、別のスレッドまたは複数のスレッドの出力に非常に依存する可能性があります.このスレッドは、実行を続行するために他のスレッドの実行が完了するまで待つ必要があります.join()メソッドは無線待機を表し,現在のスレッドをブロックし続け,ターゲットスレッドの実行が完了したことを知る.join(long millis)メソッドは、最大待機時間を与え、所定の時間を超えたターゲットがまだ実行されている場合、現在のスレッドは待ちきれないため、下に実行され続けます.joinの本質は、現在のスレッドのオブジェクトインスタンスにwait()を呼び出すことです.
Thread.yield()は興味深い方法で、現在のスレッドがCPUを譲渡しますが、CPUを譲渡することは、現在のスレッドが実行されていないことを意味しません.現在のスレッドがCPUを譲り渡すと,CPUリソースの争奪も行われるが,再び割り当てられるかどうかは定かではない.1つのスレッドが重要でない場合、または優先度が非常に低く、CPUリソースの消費が多すぎることを恐れている場合は、yield()を適切に呼び出し、他の重要なスレッドにいくつかの作業の機会を与えることができます.