Java Concurrency - добавление ловушки завершения работы перед вызовом `ExecutorService # execute` - PullRequest
0 голосов
/ 29 октября 2018

У меня есть работающий поток MyDesiredRunnable, который имеет следующий запуск:

public void run() {
    try {
        this.process();
    } catch (InterruptedException e) {
        isAlive.set(false);
    }
}

isAlive является AtomicBoolean.

Планировщик:

// Class definition bla bla bla
   private final ExecutorService exth = Executors.newSingleThreadExecutor();

public void schedule() {
    Runnable r = new MyDesiredRunnable();
    Runnable sdt = ()->{MyDesiredRunnable.isAlive.set(false);};

    Runtime.getRuntime().addShutdownHook(new Thread(sdt));
    this.exth.execute(r);
}

Этот планировщик всегда будет только одним экземпляром. У меня такой вопрос: «Имеет ли значение, если я добавлю хук выключения перед вызовом execute. Все, что я могу понять из javadocs, это то, что хук выключения не будет решен до тех пор, пока не будет дано команду shutodown JVM. Кроме того, команда execute также кажется, ничего не говорит против перехвата завершения до / после. Просто в нескольких ExecutorService примерах SO или даже в некоторых книгах регистрация выключения происходит после того, как мы вызываем execute. Поэтому я просто хотел узнать, есть ли это «улов», который я не понимаю.

Спасибо

1 Ответ

0 голосов
/ 29 октября 2018

Чтобы не пытаться определить, выполняется ли задача косвенно, вы можете использовать сам поток. Если поток не жив, ваша задача не выполняется.

class ThreadedRunnable implements Runnable {
    volatile boolean started = false;
    volatile Thread thread;
    Runnable runnable;

    ThreadedRunnable(Runnable runnable) { this.runnable = runnable; }

    public void run() {
        thread = Thread.currentThread();
        started = true;
        try {
            runnable.run();
        } catch (Throwable t) { // don't silently discard it
            logger.error(runnable + " died", t);
        } finally {
            thread = null;
        }
    }

    public String state() { // or return an Enum
        Thread t = thread;
        return !started ? "not started" :
               t == null || !t.isAlive() ? "finished" : "running";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...