gpt4 book ai didi

java - ExecutorService 未正确调用 Interrupt()

转载 作者:行者123 更新时间:2023-12-01 18:59:05 24 4
gpt4 key购买 nike

我创建了一个 ExecutorService 来管理所有单独的线程,每个线程都处理套接字连接。我重写了每个线程中的中断方法,以便在线程中断时关闭套接字,以防套接字当前处于不可中断方法(如 socketserver.accept())中。

如果我在应用程序关闭时手动调用线程上的中断,则一切都会正常关闭。但是,如果我使用 ExecutorService 并运行 shutdownNow,它似乎根本没有调用重写的中断方法。

为什么它不调用我重写的方法?

最佳答案

我遇到了同样的问题,并找到了使用线程池的解决方案。请参阅下面的说明和简化代码。

1)创建了我自己的线程类,它重写了interrupt(),还调用了一个close()方法,该方法是使用我创建的set方法和Closeable接口(interface)进行配置的。如果已配置,则重写 Interrupt() 以调用 close 方法。

public class CloseableThread extends Thread {
private Closeable mCloseable = null;

public interface Closeable {
void close();
}

// Constructors deleted

public void interrupt() {
super.interrupt();
if (mCloseable != null) {
mCloseable.close();
}
}

public void setCloseable(Closeable closeable) {
mCloseable = closeable;
}
}

2)创建了我自己的池类,它扩展了 ThreadPool,它有一个用于我的可关闭线程的工厂,并覆盖 beforeExecute() 以设置可关闭。

public class CloseableThreadPoolExecutor extends ThreadPoolExecutor {
static class CloseableThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
return (Thread) new CloseableThread(r);
}
}

// Constructors deleted

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

if (t instanceof CloseableThread && r instanceof Closeable) {
((CloseableThread) t).setCloseable((Closeable) r);
}
}
}

3) 确保任何使用套接字的任务都实现 Closeable,并且 close() 方法会以某种方式导致套接字关闭。确保干净地处理以这种方式关闭时将生成的套接字异常。

关于java - ExecutorService 未正确调用 Interrupt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14866238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com