Я должен сказать, я думаю, что другие два ответа в настоящее время имеют слишком низкое мнение о классах параллелизма Java. Они не дадут вам миллисекундную точность (чего ожидают «реальные» приложения реального времени), но обычно они работают достаточно хорошо. Я написал крупномасштабные коммерческие сервисы с использованием Futures и Executors, и они обычно работали в течение 10 миллисекунд ожидаемого времени, даже под нагрузкой.
Я провел этот тест как на MacOS 10.6 с Java 1.6, так и на WinXP с Java 1.6.0_22, и оба они работают как положено.
Я изменил код следующим образом, чтобы проверить точность:
long time1 = System.nanoTime();
System.out.println("Submitting");
final Future<Object> future = exec.submit(call);
try {
future.get(1000, TimeUnit.MILLISECONDS);
long time2 = System.nanoTime();
System.out.println("No timeout after " +
(time2-time1)/1000000000.0 + " seconds");
fail("expected TimeoutException");
} catch (TimeoutException ignore) {
long time2 = System.nanoTime();
System.out.println("Timed out after " +
(time2-time1)/1000000000.0 + " seconds");
}
finally {
exec.shutdown();
}
В XP выводится «истекло время ожидания через 1,002598934 секунд», а в MacOS X выводится «время истекло через 1,003158 секунд».
Если оригинальный постер описывает их ОС и версию JDK, возможно, мы могли бы определить, является ли это конкретной ошибкой.