7

メソッドの呼び出しに 10 秒以上かかる場合は、それを強制終了して先に進みたいと思います。

この問題を解決する唯一のオプションはマルチスレッドですか?

私が非常に慣れていないマルチスレッドを使用する場合、run メソッドには次の 1 つのメソッドのみが含まれます。myMethod() が無限ループに陥った場合、このスレッドを中断する方法はありますか?

public void run() {
    myMethod();
}

myMethod() が以下であり、それを変更することはオプションではないと仮定しましょう。

while(true){
    System.out.println("Thinking.");
        for (int i = 0; i < 100000; i++) {
            //wasting time
        }
}

私は Mik378 のソリューションを使用していましたが、myMethod が InterruptedException 例外をスローしないため、これはうまくいかないと思います。

4

4 に答える 4

7

これを達成するためにスレッドを使用するのは難しいです。スレッドからの協力なしにスレッドを強制終了する、移植可能で安全な方法はありません。詳細については、Java でスレッドを強制終了する方法を参照してください。なぜ[et al] は推奨されないのですか?Thread.stop

より堅牢なアプローチは、別のプロセスのコンテキストでメソッドを呼び出し、そのプロセスを強制終了することです。

さらに良いアプローチは、そもそもなぜ物事が動かなくなるのかを理解し、動かなくなるのを防ぐ方法 (またはタイムアウトを設定して例外をスローする方法など) を見つけることです。あなたの場合、それが現実的な可能性であるかどうかはわかりません。

于 2012-12-06T16:47:55.180 に答える
2

Runnable にラップされたスレッド (「スレッド」という名前) を開始できます。それからする

thread.start();
thread.join(10000);
if (thread.isAlive()) {
  thread.interrupt();
}

NPE が述べたように、myMethod() を自分でコーディングしていないか、割り込みの影響を受けやすいことがわかっている場合を除き、これが実際にスレッドを強制終了するという保証はありません。

myMethod を自分で実装する場合は、myMethod() 内でメソッドが実行されるループ内に次のようなものを用意する必要があります。

if (Thread.interrupted()) {
  break;  // or whatever you need to do to end the method quickly
}

例外処理を省略しました。コンパイラは、その点で何をする必要があるかを教えてくれます。

于 2012-12-06T17:14:36.927 に答える
1

2 つの別個のスレッドを使用する場合:

class Job implements Runnable {

        public void run(){
            try{
              myMethod();  // declared within this class or wherever you want
            } catch(InterruptedException){
                System.out.println("Interrupted now due probably to infinite loop !!");
            } 
        }

        public static void main(String[] args) throws InterruptedException {
           Job job = new Job();
           Thread process = new Thread(job);
           process.start(); 
           process.join(10000);  //wait here in order to detect wrong loop
           if(process.isAlive()){
             process.interrupt();
           }
        }
}
于 2012-12-06T17:15:59.613 に答える
0

私はNPEに同意します。あなたの最善の策は、別のプロセスでマルチスレッドを使用することです。メソッドをデバッグできない場合は、これが最も安全な方法のようです。他のオプションは、単にタイマーを使用し、タイマーが 10 秒を超えた場合に例外をスローすることです。しかし、それは一種の非正統的なものになります。

于 2012-12-06T16:57:05.887 に答える