Как установить таймаут в потоке Java после того, как поток создания уже вернулся? - PullRequest
0 голосов
/ 23 января 2019

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

У меня есть рабочее решение, но я не уверен, что это лучший способ сделать это.

  new Thread(() -> {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Void> future = executor.submit(new Callable() {
            public Void call() throws Exception {
              workThatTakesALongTime();
        });
        try {
            future.get(timeoutMillis, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            LOGGER.error("Exception from timeout.", e);
        }
    }).start();

Есть ли лучший способ сделать это без использования ExecutorService в потоке?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

См. Метод ExecutorService.invokeAny(), который позволяет передавать значение времени ожидания.

0 голосов
/ 23 января 2019

Есть несколько способов сделать это. Одним из способов, как и вы, было бы использование ExecutorService. Гораздо более простой подход - создать новый поток и очередь, из которой поток будет искать, если что-то будет каждые несколько секунд. Примером может быть такой:

Queue<Integer> tasks = new ConcurrentLinkedQueue<>();

new Thread(){
    public void run() throws Exception {
        while(true){
            Integer task = null;

            if((task = tasks.poll()) != null){
                // do whatever you want
            }

            Thread.sleep(1000L); // we probably do not have to check for a change that often
        }
    }
}.start();


// add tasks
tasks.add(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...