ExecutorService没有正确调用interrupt()方法。

4
我创建了一个ExecutorService来管理处理套接字连接的每个单独线程。我覆盖了这些线程中的interrupt方法,以便在线程被中断时关闭套接字,以防套接字当前处于不可中断的方法中(如socketserver.accept())。
如果在应用程序关闭时手动调用线程的interrupt,则一切都会正确关闭。但是,如果使用ExecutorService并运行shutdownNow,则似乎根本没有调用重写的interrupt方法。
为什么它没有调用我的重写方法?

你是如何将线程放入ExecutorService中的?你使用自定义的ThreadFactory吗? - jtahlborn
我找到了问题所在。ExecutorService将其作为参数的Runnable进行包装,因此传递Thread没有任何作用。奇怪的是,使用自定义ThreadFactory创建的自定义Thread,并具有在调用中断时调用的特殊关闭方法,并将此ThreadFactory传递给ExecutorService仍然无法正常工作,但我最终放弃了它,并制作了一个特殊的队列,其中包含我的Runnables和不可中断的方法,这些方法单独清除ExecutorService而不是进一步探测。 - ImpGuard
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()方法以某种方式导致套接字关闭。确保在以这种方式关闭时,干净地处理将生成的套接字异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接