1

私はJavaで、スレッドが処理を開始してから1分後のように、特定の時間が経過した後にスレッドを停止して強制終了する必要があります。Javaはこれを行う方法を提供していますか?

ここで追加することの 1 つは、ThreadPoolExecutor を使用し、RUNnable オブジェクトを ThreadPoolExecutor に送信してキューで実行することです。これはフレームワークの一部であり、ThreadPoolExecutor を削除できません。これを考えると、どのように ExecutorService を使用できますか?

4

5 に答える 5

2

これと同じ問題ですExecutorService実行するために使用してくださいRunnable

于 2012-11-29T21:46:56.657 に答える
2

スレッドはロックやその他のリソース (ファイルなど) を保持できるため、「スレッドを強制終了」するだけではいけません。代わりに、スレッドで実行するstopメソッドを追加します。これにより、内部フラグが設定され、メソッドで定期的にチェックされます。このような:Runnablerun

class StopByPollingThread implements Runnable {
    private volatile boolean stopRequested;
    private volatile Thread thisThread;

    synchronized void start() {
        thisThread = new Thread(this);
        thisThread.start();
    }

    @Override
    public void run() {
        while (!stopRequested) {
            // do some stuff here
            // if stuff can block interruptibly (like calling Object.wait())
            // you'll need interrupt thread in stop() method as well
            // if stuff can block uninterruptibly (like reading from socket)
            // you'll need to close underlying socket to awake thread
            try {
                wait(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    synchronized void requestStop() {
        stopRequested = true;
        if (thisThread != null)
            thisThread.interrupt();
    }
}

さらに、 Goetz による実際の Java 並行性を読むこともできます。

于 2012-11-29T21:55:53.117 に答える
1

ExecutorServicewithFuture.getまたはstyle メソッドを使用するとinvoke*、必要なものが得られます。ただし、スレッド内を定期的にチェックして、タイムアウトに達したかどうかを確認し、スレッドが正常に終了できるようにすることはいつでもできます。

于 2012-11-29T21:47:03.147 に答える
0

スレッドを中断することはできますが、ワーカー スレッドで行っていることによっては、Thread.isInterrupted() を手動で確認する必要があります。詳しくはこちらをご覧ください。

于 2012-11-29T21:47:07.960 に答える
0

Thread.interrupt() を試して、スレッド自体で Thread.isInterrupted() による中断をチェックできます。または、スレッドがしばらくスリープする場合は、InterruptedException で終了します。これは、あなたが何をしているかに関係なく、本当に重要です。IO タスクを待っている場合は、ストリームを閉じて、スレッドでスローされた IOException で終了してみてください。

于 2012-11-29T21:48:45.333 に答える