Javaマルチスレッドのスレッド中止
2441 ワード
shop()
Javaではshop()メソッドが提供されてスレッドを中断するが,暴力的すぎて期限切れメソッドと定義されている.スレッドがデータを変更したときに半分修正された場合、shop()メソッドでスレッドを中断すると、データが半分修正され、半分修正されていない状態になり、データは廃棄されます(ヒントはありません).何をしているのか分からない限り、shop()は使用しないでください.
Javaでの推奨使用中断:
public void Thread.interrupt() //
public boolean Thread.isInterrupted() //
public static boolean Thread.interrupted() // ,
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run () {
while (true) {
Thread.yield();
}
}
};
t1.start();
Thread.sleep(2000);
ti.interrupt();
}
ここでinterrupt()メソッドが呼び出されますが、スレッドは停止しません.この方法は割り込み状態を設定しただけであるため、スレッドはこの割り込み状態に反応しなかった.
以下のコードは割り込み状態の処理を行った.
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run () {
while (true) {
if (Thread.currentThread().isInterrupted()){ // , 。
System.out.println("Interruted!");
breadk;
}
Thread.yield();
}
}
};
t1.start();
Thread.sleep(2000);
ti.interrupt();
}
ただし、wait()またはsleep()メソッドを使用する場合は、次の点に注意してください.
まず、Thread.sleep()関数について説明します.
public static native void sleep(long millis) throws InterruptedException
スレッドがスリープされている場合、中断するとエラーが放出されます.この例外は実行時異常ではありません.キャプチャして処理する必要があります.
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread() {
@Override
public void run () {
while (true) {
if (Thread.currentThread().isInterrupted()){ // , 。
System.out.println("Interruted!");
break;
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
System.out.println("Interruted When Sleep");
//
Thread.currentThread().interrupt();
}
Thread.yield();
}
}
};
t1.start();
Thread.sleep(2000);
t1.interrupt();
}
catchブロックでは割り込み終了が可能だったが、データの整合性と完全性を破壊するため(shop()を直接使用して異曲同工を使うのと同じである).したがって、例外処理では、スレッドが完了してから終了するように、割り込み状態を再設定する必要があります(この場合、例外が投げ出されるとステータスがクリアされるため).