Переопределить метод прерывания для потока в пуле потоков - PullRequest
0 голосов
/ 07 февраля 2019

Скажем, у меня есть это:

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 Ответ

0 голосов
/ 07 февраля 2019

Определите, как создаются потоки для пула, указав 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 можно выразить лямбда-выражением.

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

Если для потока не требуется дополнительная настройка (например, сделать его демоном), вы можете использовать ссылку на метод.Однако конструктор YourThreadClass(Runnable) должен существовать.

ThreadFactory factory = YourThreadClass::new;

Я бы посоветовал прочитать документы ThreadPoolExecutor и Executors.Они довольно информативны.

...