同期アプローチ (ここに掲載されているさまざまな形式) を使用しても、まったく役に立ちません。
このアプローチは、一度に1 つのスレッドがクリティカル セクションを実行することを確認するのに役立ちますが、これは望ましいことではありません。スレッドが中断されないようにする必要があります。
読み取り/書き込みロックは役に立ちますが、他のスレッドが書き込みロックを使用しようとしないため、違いはありません。
JVM は同期セクションを実行するために追加の検証を実行する必要があるため、アプリケーションが少し遅くなるだけです (1 つのスレッドでのみ使用されるため、CPU が無駄になります)。
実際、あなたのやり方では、スレッドは「本当に」中断されていません。しかし、CPU 時間を他のスレッドに明け渡さなければならないので、そうなっているように見えます。スレッドの仕組みは次のとおりです。CPU は、各スレッドに非常に短い時間の間、実行する機会を与えます。単一のスレッドが実行されている場合でも、そのスレッドは他のアプリケーションの他のスレッドで CPU 時間を生み出しています (説明を簡単にするために単一のプロセッサ マシンを想定しています)。
システムがアプリ内の各スレッドを少しの間実行させているため、スレッドが時々一時停止/中断されているように見えるのはおそらくそれが理由です。
それで、あなたは何ができますか?
中断がないという認識を高めるためにできることの 1 つは、スレッドにより高い優先度を割り当て、残りの優先度を下げることです。
すべてのスレッドの優先度が同じ場合、スレッド 1、2、3 の可能なスケジュールの 1 つは次のようになります。
均等に分散
1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3
最大値を 1 に、最小値を 2.3 に設定すると、次のようになります。
スレッド 1 の CPU を増やす
1,1,1,2,1,1,3,1,1,1,2,1,1,1,3,1,2,1,1,1
スレッドが別のスレッドによって中断されるには、Object.wait、Thread.join、または Thread.sleep を呼び出すことによって達成される、中断可能な状態である必要があります。
実験するいくつかの面白いコードの下に。
コード 1: スレッドの優先度を変更する方法をテストします。出力のパターンを参照してください。
public class Test {
public static void main( String [] args ) throws InterruptedException {
Thread one = new Thread(){
public void run(){
while ( true ) {
System.out.println("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
}
}
};
Thread two = new Thread(){
public void run(){
while ( true ) {
System.out.println(".............................................");
}
}
};
Thread three = new Thread(){
public void run(){
while ( true ) {
System.out.println("------------------------------------------");
}
}
};
// Try uncommenting this one by one and see the difference.
//one.setPriority( Thread.MAX_PRIORITY );
//two.setPriority( Thread.MIN_PRIORITY );
//three.setPriority( Thread.MIN_PRIORITY );
one.start();
two.start();
three.start();
// The code below makes no difference
// because "one" is not interruptable
Thread.sleep( 10000 ); // This is the "main" thread, letting the others thread run for aprox 10 secs.
one.interrupt(); // Nice try though.
}
}
コード 2. スレッドが実際に中断される方法のサンプル (この場合はスリープ中に)
public class X{
public static void main( String [] args ) throws InterruptedException {
Thread a = new Thread(){
public void run(){
int i = 1 ;
while ( true ){
if ( i++ % 100 == 0 ) try {
System.out.println("Sleeping...");
Thread.sleep(500);
} catch ( InterruptedException ie ) {
System.out.println( "I was interrpted from my sleep. We all shall die!! " );
System.exit(0);
}
System.out.print("E,");
}
}
};
a.start();
Thread.sleep( 3000 ); // Main thread letting run "a" for 3 secs.
a.interrupt(); // It will succeed only if the thread is in an interruptable state
}
}