1

新しいスレッドで関数のサードパーティモジュールを呼び出す必要があります。私が見たところ、すべてがうまくいった場合、呼び出しはすぐに完了するか、スレッドをロックするためにハングするだけです。スレッドを開始して呼び出しを行い、数秒待ってからスレッドがまだ生きている場合は、スレッドがロックされていると想定して、非推奨のメソッドを使用せずにスレッドを強制終了(または停止または放棄)するのが良い方法です。

私は今のところこのようなものを持っていますが、これがそれを行うための最良の方法であるかどうかはわかりません。非推奨であるため、Thread.stop()の呼び出しは避けたいと思います。ありがとう。

private void foo() throws Exception
{
        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };
        Thread thread;
        thread = new Thread(runnable);
        thread.start();
        thread.join(3500);
        if (thread.isAlive())
        {
            thread.stop();
            throw new Exception();
        }

}
4

3 に答える 3

2
public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }

スレッドを停止する方法に関するこのリンクを参照してください、それは主題をよくカバーしています

于 2010-06-17T19:20:46.487 に答える
1

あなたが望むことを(無条件に)行う方法はありません。たとえば、stuff that could potentially lock up the thread.このように見える場合、System.exit()がなければ、それを停止する方法はありません。

public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}

アプリが動かなくなったら、jstackを実行します(またはデバッガーを使用します)。何が機能を妨げているのかを理解し、修正してみてください。

于 2010-06-17T19:28:56.343 に答える
0

java.util.concurrent Executorフレームワーク、特にFuture<T>インターフェースについて調べます。これらを使用すると、java.lang.Threadの気まぐれからいくらか抽象化され、タスクがどのように実行されるか(別のスレッドであるかどうか、スレッドがプールからのものであるか、インスタンス化されるかどうか)から適切に分離されます。飛ぶなど)

Futureインスタンスは、少なくとも、あなたisDoneisCancelledメソッドを提供します。

ExecutorService(のサブインターフェイスExecutor)は、未処理のタスクをシャットダウンするためのいくつかの手段を提供します。ExecutorService.awaitTermination(long timeout, TimeUnit unit)またはメソッドをチェックしてください

private void foo() throws Exception
{
        ExecutorService es = Executors.newFixedThreadPool(1);

        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };

        Future result = es.submit(runnable);

        es.awaitTermination(30, TimeUnit.SECONDS);

        if (!result.isDone()){
            es.shutdownNow();
        }

}
于 2010-06-17T19:18:07.627 に答える