4

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

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

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

4

1 回答 1

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() 以设置可关闭。

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() 方法以某种方式导致套接字关闭。确保干净地处理以这种方式关闭时将生成的套接字异常。

于 2013-05-03T22:10:58.463 回答