Есть ли в любом случае поток для перехвата InterruptException, кроме помещения Time.Unit.Seconds.sleep? - PullRequest
0 голосов
/ 24 мая 2019

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

Прямо сейчас я заканчиваю поток через

final Future handler = executor.submit(new MyTask());

executor2.schedule(new Runnable(){
            public void run(){
                handler.cancel(true);
            }
}, 3, TimeUnit.SECONDS);

Есть ли правильный способ прервать поток без TimeUnit.MILLISECONDS.sleep(1);? Добавление сна кажется хакерским

    @Override
    public Boolean call() {
        try  {
            // Sometimes hangs
            db.call();
            // Need it to be here to call InterruptedException
            TimeUnit.MILLISECONDS.sleep(1);
            return true;
        } catch (InterruptedException e) {
            return false;
        }
    }

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Есть ли правильный способ прервать поток без TimeUnit.MILLISECONDS.sleep(1);?

Это не прерывает поток.Он просто проверяет, был ли поток прерван, либо до, либо во время сна, и выдает InterruptedException, если это было.

Если вы хотите прервать поток, используйте:

t.interrupt();

Если вы хотите проверить, был ли текущий поток прерван, используйте:

Thread.interrupted()

Обратите внимание, что это очищает это прерванное состояние: используйте Thread.currentThread().isInterrupted() для проверки без очистки состояния.

0 голосов
/ 24 мая 2019

Начиная с Java 9, вы можете использовать CompletableFuture.orTimeout :

Future<?> handler = CompletableFuture.runAsync(new MyTask())
    .orTimeout(3, TimeUnit.SECONDS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...