20

内にいくつかのタスクがありTheadPoolExecutorます。インターフェイスに停止ボタンがあり、内部のすべてのスレッドをThreadPoolExecutorすぐに終了する必要があります。私はそれを行う方法を探しています。(shutDown()またはなしshutDownNow())。

ありがとう

4

5 に答える 5

16

スレッドをすぐに安全に強制終了することはできません。代わりに、タスクは割り込みを尊重し、割り込み時に停止する必要があります。を使用するThreadPoolExecutor.shutdownNow()と、実行中のすべてのタスクが中断されます。

別のプロセスのスレッドに代わる唯一の方法は、プロセスを強制終了するシグナルを発行することです。

于 2012-10-10T14:37:41.930 に答える
7

古い質問ですが、ThreadPoolExecutor を拡張して、実行中の Thread 参照を beforeExecute() でキャプチャできると思います。shutdownNow() が呼び出されると、実行中のすべてのスレッドを stop() できます。ただし、タスクで isInterrupted() に依存することを強くお勧めします。

サンプルコード ->

public class KillableThreadPoolExecutor extends ThreadPoolExecutor {

    private final Map<Runnable, Thread> executingThreads;

    public KillableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, String threadNamePrefix) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new YoungMemorySafeLinkedBlockingQueue<Runnable>(), ThreadFactories.create(threadNamePrefix));
        executingThreads = new HashMap<>(maximumPoolSize);
    }

    @Override
    protected synchronized void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
        executingThreads.put(r, t);
    }

    @Override
    protected synchronized void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if(executingThreads.containsKey(r)) {
            executingThreads.remove(r);
        }
    }

    @Override
    public synchronized List<Runnable> shutdownNow() {
        List<Runnable> runnables = super.shutdownNow();
        for(Thread t : executingThreads.values()) {
            t.stop();
        }
        return runnables;
    }
}
于 2016-10-20T16:44:00.260 に答える
6

shutdown()ThreadPoolExecutor新しくサブミットされたすべてのタスクを拒否し、保留中のタスクをキューから削除します (ThreadPool無制限のキュー エグゼキュータの場合)。はshutdownNow()まったく同じことを行い、 のinterrupt()メソッドも呼び出しますThread。したがって、run()メソッドでは、適切に処理する必要があります。

try {
   Thread.sleep(1000);
} catch (InterruptedException ie) {
   // Handle the exception, and close resources.
}
于 2012-10-10T14:41:03.943 に答える
1

スレッドで sCallableの代わりにsを使用できる場合は、呼び出し時に実行中のタスクを取り除くために呼び出すことができます。RunnablesomeTask.cancel()shutdownNow()

私はこれを試していないので、あなたが望むように動作することを保証することはできませんが、javadoc の説明から判断すると、試してみる価値があることに注意してください。

于 2012-10-10T14:44:43.833 に答える