我创建了一个ExecutorService来管理我处理套接字连接的所有单独线程。我重写了每个线程中的中断方法,以便在线程被中断时关闭套接字,以防套接字当前处于不间断的方法(如socketserver.accept())。
如果我在应用程序关闭时手动调用线程上的中断,则一切都会正常关闭。但是,如果我使用我的ExecutorService并运行shutdownNow,它似乎根本不会调用重写的中断方法。
为什么不调用我的重写方法?
答案 0 :(得分:0)
我遇到了同样的问题,并找到了使用线程池的解决方案。请参阅下面的说明和简化代码。
1)创建了我自己的线程类,它覆盖了interrupt(),也调用了一个close()方法,该方法是使用我创建的set方法和Closeable接口配置的。如果已配置,则覆盖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()以设置closeable。
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()方法以某种方式导致套接字关闭。确保干净地处理以这种方式关闭时将生成的套接字异常。