有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无论如何都有一个线程来捕获中断异常,而不仅仅是放置时间。单元秒。睡觉

我有一个线程,在其内部进行数据库调用,有时会挂起,通常超时应该在客户端库中处理,但在这种情况下,客户端库不能正确处理它,因此我必须添加一个额外的计划作业,以取消正在进行数据库调用的线程,如果它需要太长时间来避免背压

现在我正在终止线程

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. # 1 楼答案

    Is there a proper way to interrupt a thread without TimeUnit.MILLISECONDS.sleep(1); ? 

    这不会中断线程。它只检查线程是否在睡眠之前或睡眠期间被中断,如果被中断,则抛出InterruptedException

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

    t.interrupt();
    

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

    Thread.interrupted()
    

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

  2. # 2 楼答案

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

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