Вы, вероятно, не имеете в виду «атомарно», я думаю, что вы имеете в виду «без задержки» здесь. Так что 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
на одну секунду до реального срока должна быть в порядке: -)