Выполняет ли таймаут в будущем выполнение Thread

При использовании объектов ExecutorService и Future (при отправке задач Runnable), если я укажу значение тайм-аута для будущей функции get, будет ли основной поток быть убит при вызове TimeoutException?

Ответ 1

Это не так. Почему? Если вы не сообщите об этом.

Здесь существует очень важная проблема в случае, например, для Callable. Если вы ожидали результата за 20 секунд, и вы его не получили, то вас больше не интересует результат. В то время вы должны вообще отменить задачу.

Что-то вроде этого:

Future<?> future = service.submit(new MyCallable());
    try {
        future.get(100, TimeUnit.MILLISECONDS);
    } catch (Exception e){
        e.printStackTrace();
        future.cancel(true); //this method will stop the running underlying task
    }

Ответ 2

Нет, это не так. Моровер даже не пытался прервать задачу. В первую очередь Future.get с таймаутом не говорит об этом. Во-вторых, попробуйте мой тест, чтобы увидеть, как он себя ведет.

    ExecutorService ex = Executors.newSingleThreadExecutor();
    Future<?> f = ex.submit(new Runnable() {
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("finished");
        }
    });
    f.get(1, TimeUnit.SECONDS);

через 1 секунду он печатает

Exception in thread "main" java.util.concurrent.TimeoutException
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
    at java.util.concurrent.FutureTask.get(FutureTask.java:91)
    at Test1.main(Test1.java:23)

через 1 секунду задача успешно завершается

finished