Почему нет метода "awaitTermination (Date крайний срок)"? - PullRequest
2 голосов
/ 23 августа 2011

У меня есть список задач, отправленных на ExecutorService.Но мне нужно завершить работу ExecutorService до крайнего срока в 2:30, даже если задачи еще не завершены.Как мне этого добиться?Я проверил API, есть только метод, подобный приведенному ниже:

ExecutorService exec = //...    
exec.awaitTermination(100, TimeUnit.MILLISECONDS);

Но как сделать так, чтобы следующий блок выполнялся атомарно?То есть как мне избежать разрыва?Например:

long timeDiff= calculate(now, deadline);
// Gap: assuming current thread does not have chance to run for 10 minutes...
exec.awaitTermination(timeDiff, TimeUnit.MILLISECONDS);

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Вы, вероятно, не имеете в виду «атомарно», я думаю, что вы имеете в виду «без задержки» здесь. Так что timeDiff все еще правильно при вызове exec.awaitTermination().

Я предполагаю, что это правильно, поэтому ответ: Вы не можете .

Если вас интересуют подробности: Ваш Java-код преобразуется в байт-коды Java, и они выполняются JVM, который является обычным процессом, работающим в вашей операционной системе. И вы просто не можете помешать операционной системе прерывать потоки (я предполагаю, что вы используете операционную систему с вытесняющей многозадачностью (каждая UNIX (включая Linux и Mac OS X), Windows 95 или лучше, ...)).

Даже если бы вы могли сделать все это в одном байт-коде Java, он все равно не работал бы так, как вы хотите, потому что операционная система могла прервать вас в середине одного байт-кода Java.

И даже awaitTermination(Date deadline) метод здесь не поможет. Он тоже должен быть кем-то реализован.

Лучшее, что вы можете сделать, это сделать это как можно меньше байт-кодов.

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

Однако, может быть немного более точным:

Date deadline = ....;

final TimerTask stopTask = new TimerTask() {
    public void run() {
        exec.shutdownNow();
    }
};

new Timer().schedule(stopTask, deadline);

Но, как я уже сказал: реальной гарантии shotdownNow() исполняется НЕМЕДЛЕННО в deadline. На самом деле, установка deadline на одну секунду до реального срока должна быть в порядке: -)

1 голос
/ 23 августа 2011

Дождитесь крайнего срока в другом высокоприоритетном потоке (или таймере) и вызовите exec.shutdownNow()

...