Eski soru, ancak ThreadExpecent() öğesinde çalışan Thread referansını yakalamak için ThreadPoolExecutor öğesini genişletebilirsiniz. shutdownNow() çağrıldığında, tüm çalışan Konuları durdurabilirsiniz. Görevlerinize güvenmek için güçlü bir şekilde inInterrupted() kullanmanızı öneririm.
Örnek kod ->
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;
}
}
Neden shtudown() 'veya' shutdownNow() 'kullanmıyorsunuz (veya kullanamıyorsunuz)? Bunu yapmanın yolu. – Gray
İş parçacıklarının sonlandırılmasından önce geçerli görevlerin bitmesini beklemesi gerekir. Yani, hemen dişleri öldürmez. – deadlock
'shutdown()' geçerli görevlerin tamamlanmasını bekler. İşte bu nokta. – Gray