FutureTask设置超时时间有什么用,超时线程会停止吗?

1,663 阅读1分钟

任务执行超时,想做下日志记录,该如何处理?

我们想到了使用FutureTask,FutureTask的get方法可以设置超时时间,一旦线程超时,get方法就会抛出TimeoutException异常

我们看一段测试代码:

public class FutureTaskOutTime {

    public  static  void  main(String[] args) throws InterruptedException {

        FutureTask<String> futureTask = new FutureTask<>(()->{
            int i=0;
            while(true){
                i++;
                System.out.println("run:" + i);
                //到1000时返回
                if(i%1000==0) {
                    System.out.println("run:" + i);
                    return String.valueOf(i);
                }
            }

        });

        Thread my = new Thread(futureTask);
        my.start();
        try {
          //1ms超时
          String i=  futureTask.get(1,TimeUnit.MILLISECONDS);
          System.out.println("return i:"+i);
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            System.out.println("Time out");
        }

    }

我运行了几次,等不到get方法返回,就会报TimeoutException,打印出Time out了。

那么在这之后,线程会停止打印吗?

答案是不会。

执行超时,异步线程并不会停止,它还在执行,直到处理完成或返回结果为止。

中间打印部分省略

\