0
public class Ex4 extends Thread {
  boolean ans;
  boolean change=false;

  public boolean isPrime(long n, double maxTime) throws RuntimeException {
    final Thread a;
    Thread b;
    final RuntimeException e;
    final long num = n ;
    final double mtime = maxTime;
    a = new Thread(){
        public void run(){
                try{
                    ans = Ex4_tester.isPrime(num);
                    change=true;
                }
                catch ( RuntimeException exp){
                    throw exp;
                };
            }
    };
    a.start();
    try {
        sleep((long)mtime);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }
    if(a.isAlive()){
        a.interrupt();
    }
    if(a.isInterrupted()){
        throw new RuntimeException("time for check exceeded");
    }
    return ans;
  }
}

Ex4_tester.isPrime が無限ループに入る場合を除いて、すべて正常に動作します (問題ありません。そうする必要があります)。スレッドが中断されてもプロセスが実行され続け、スレッドが実際に停止しないという問題

4

5 に答える 5

2

中断されたスレッドは停止しません。スレッドが特定の待機状態とスリープ状態から抜け出すだけです。スレッドが別のスレッドからの入力に基づいて無限ループを終了するには、ループ内の Atomic<> に対して明示的なチェックを行い、制御スレッドにアトミック変数の状態をスレッド 'a' がループを終了する場所に変更させます。

于 2013-01-14T21:09:02.807 に答える
1

のような特定のメソッドのみObject.wait()がスローされInterruptedExceptionます。スレッドがこれらのメソッドのいずれも呼び出さない場合、スレッドは中断されません。

つまり、Java スレッドに非同期的に割り込むことはできません。非同期割り込みをサポートするスレッド システムはほとんどありません。

于 2013-01-14T21:06:59.127 に答える
0

割り込みには、設計上安全にスレッドに割り込むことができる時点で、明示的なチェックが必要です。このチェックを実行しない (または実行するメソッドを呼び出す) と、スレッドは実行され続けます。

于 2013-01-14T21:18:26.460 に答える
0

最も簡単な方法は、スレッドをデーモンに設定することです。つまり、a.setDaemon(true)開始前に呼び出します。これが開始されたままのスレッドのみである場合、プロセスは終了します。

スレッドを中断したい場合は、割り込みメソッドのこのドキュメントを読んでください

于 2013-01-14T21:09:17.733 に答える
0

interruptメソッドはInterruptedException、スレッドが特定の実行ポイント ( などsleep) にある場合にのみ発生します。コードのキャンセル ポリシーが無効です。スレッドを停止する別の方法を検討する必要があります。

于 2013-01-14T21:10:15.773 に答える