无论如何,除了放置Time.Unit.Seconds.sleep外,是否还有一个线程可以捕捉InterruptException?

时间:2019-05-24 17:51:06

标签: java multithreading executorservice

我有一个线程,在它的内部有时会挂起数据库调用,通常应该在客户端库中处理超时,但是在这种情况下,客户端库无法正确处理它,因此我必须添加一个额外的计划作业如果花费太长时间以避免背压,则取消正在进行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 个答案:

答案 0 :(得分:1)

  

在没有TimeUnit.MILLISECONDS.sleep(1);的情况下是否有适当的方法来中断线程?

这不会中断线程。它仅在睡眠之前或睡眠期间检查线程是否已被中断,并抛出InterruptedException

如果要中断线程,请使用:

t.interrupt();

如果要检查当前线程是否已中断,请使用:

Thread.interrupted()

请注意,这将清除此中断状态:使用Thread.currentThread().isInterrupted()进行检查而不清除该状态。

答案 1 :(得分:0)

从Java 9开始,您可以使用CompletableFuture.orTimeout

Future<?> handler = CompletableFuture.runAsync(new MyTask())
    .orTimeout(3, TimeUnit.SECONDS);