【问题标题】:Override interrupt method for thread in threadpool覆盖线程池中线程的中断方法
【发布时间】:2019-07-01 00:58:51
【问题描述】:

说我有这个:

class Queue {
  private static ExecutorService executor = Executors.newFixedThreadPool(1);

  public void use(Runnable r){
    Queue.executor.execute(r);
  }

}

我的问题是 - 如何定义池中使用的线程,特别是想覆盖池中线程的中断方法:

   @Override 
    public void interrupt() {
      synchronized(x){
        isInterrupted = true;
        super.interrupt();
      }
    }

【问题讨论】:

    标签: java multithreading threadpool executorservice


    【解决方案1】:

    通过指定ThreadFactory 来定义如何为池创建线程。

    Executors.newFixedThreadPool(1, new ThreadFactory() {
        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r) {
                @Override
                public void interrupt() {
                    // do what you need
                }
            };
        }
    });
    

    当然,ThreadFactory 可以用 lambda 表示。

    ThreadFactory factory = (Runnable r) -> new YourThreadClass(r);
    

    如果一个线程不需要额外的设置(比如让它成为一个守护进程),你可以使用方法引用。不过,构造函数 YourThreadClass(Runnable) 应该存在。

    ThreadFactory factory = YourThreadClass::new;
    

    我建议阅读ThreadPoolExecutorExecutors 的文档。它们信息量很大。

    【讨论】:

    猜你喜欢
    • 2012-07-06
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    相关资源
    最近更新 更多