首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecutorService未正确调用interrupt()

ExecutorService未正确调用interrupt()
EN

Stack Overflow用户
提问于 2013-02-14 09:11:58
回答 1查看 262关注 0票数 4

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-04 06:10:58

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

1)创建了我自己的线程类,该类覆盖了interrupt(),还调用了close()方法,该方法是使用我创建的set方法和Closeable接口配置的。覆盖interrupt()以调用close方法(如果已配置)。

代码语言:javascript
复制
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,为我的closeable线程提供了一个工厂,并重写了beforeExecute()来设置closeable。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14866238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档