在线程池中为线程覆盖中断方法

5

假设我有这样一个代码:

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();
      }
    }
1个回答

7

通过指定ThreadFactory来定义池中线程的创建方式。

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

当然,通过lambda表达式可以创建一个ThreadFactory
ThreadFactory factory = (Runnable r) -> new YourThreadClass(r);

如果线程不需要额外的设置(比如将其设置为守护线程),您可以使用方法引用。但是,构造函数YourThreadClass(Runnable)必须存在。
ThreadFactory factory = YourThreadClass::new;

我建议阅读ThreadPoolExecutorExecutors的文档。它们非常详细。

谢谢。提供文档链接会更好,这个很难找!顺便说一句,我认为 newFixedThreadPool 是我要找的,但还有 cachedThreadPool,我不知道那是什么。 - Alexander Mills
2
@AlexanderMills 在 https://dev59.com/PHNA5IYBdhLWcg3wdtv5 和 https://dev59.com/yWMl5IYBdhLWcg3w_rKD 这两个帖子中可以了解到Executors.newCachedThreadPool和Executors.newFixedThreadPool之间的区别。 - Andrew Tobilko
非常感谢,您似乎对Java很有了解,这是一个相关的问题,如果您想获得更多积分,请查看以下链接:https://stackoverflow.com/questions/54564805/force-re-use-of-thread-by-completablefuture - Alexander Mills
@AlexanderMills 很高兴提供帮助,已经回答了那里。 - Andrew Tobilko

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