覆盖线程池中线程的中断方法

Ale*_*lls 5 java multithreading executorservice threadpool

说我有这个:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

   @Override 
    public void interrupt() {
      synchronized(x){
        isInterrupted = true;
        super.interrupt();
      }
    }
Run Code Online (Sandbox Code Playgroud)

And*_*lko 6

通过指定a来定义如何创建池的线程ThreadFactory.

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

当然,a ThreadFactory可以用lambda表示.

ThreadFactory factory = (Runnable r) -> new YourThreadClass(r);
Run Code Online (Sandbox Code Playgroud)

如果线程不需要额外的设置(比如使它成为守护进程),则可以使用方法引用.但是构造函数YourThreadClass(Runnable)应该存在.

ThreadFactory factory = YourThreadClass::new;
Run Code Online (Sandbox Code Playgroud)

我建议阅读的文档ThreadPoolExecutorExecutors.它们非常有用.

  • @AlexanderMills /sf/ask/66454881/和/sf/ask/1257016771/邪恶是很好的阅读线程(以获得这两者之间的差异) (2认同)