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()を直接使用して異曲同工を使うのと同じである).したがって、例外処理では、スレッドが完了してから終了するように、割り込み状態を再設定する必要があります(この場合、例外が投げ出されるとステータスがクリアされるため).