SimpleTimeLimiter和Callable回调函数实现超时控制

使用SimpleTimeLimiter和Callable回调函数

package com.testcode.timeout;

import com.google.common.util.concurrent.SimpleTimeLimiter;

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

public class TimeOutTest{

    public void test02(){

        System.out.println("获取学生姓名------开始");

        SimpleTimeLimiter simpleTimeLimiter=new SimpleTimeLimiter();

        Callable<Integer> task=new Callable<Integer>(){
            @Override
            public Integer call()throws Exception{
                try{
                    TimeUnit.SECONDS.sleep(1);
                    System.out.println("callable完成");
                }catch(Exception e){

                }
                return 1;
            }
        };

        Integer rtn = -1;
        try{
            rtn = simpleTimeLimiter.callWithTimeout(task,3,TimeUnit.SECONDS,true);
        }catch(Exception e){
            System.out.println("获取姓名调用异常:{}" + e.getMessage());
        }

        System.out.println("获取学生姓名------结束, rtn="+rtn);
    }

    public static void main(String[] args) {
        TimeOutTest testImpl = new TimeOutTest();
        testImpl.test02();
    }

}

 输出如下:

"D:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\Program Files\IntelliJ IDEA 2020.1.4\lib\idea_rt.jar=1206:D:\Program Files\IntelliJ IDEA 2020.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\AsiaWork\workspace\SpringBootFjm\target\classes;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-web\1.5.8.RELEASE\spring-boot-starter-web-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter\1.5.8.RELEASE\spring-boot-starter-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot\1.5.8.RELEASE\spring-boot-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-autoconfigure\1.5.8.RELEASE\spring-boot-autoconfigure-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-logging\1.5.8.RELEASE\spring-boot-starter-logging-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;D:\apache-maven-3.8.1\Repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-core\4.3.12.RELEASE\spring-core-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.8.RELEASE\spring-boot-starter-tomcat-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.23\tomcat-embed-core-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\tomcat-annotations-api\8.5.23\tomcat-annotations-api-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.23\tomcat-embed-el-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.23\tomcat-embed-websocket-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\hibernate\hibernate-validator\5.3.5.Final\hibernate-validator-5.3.5.Final.jar;D:\apache-maven-3.8.1\Repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.8.1\Repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-databind\2.8.10\jackson-databind-2.8.10.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-web\4.3.12.RELEASE\spring-web-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-aop\4.3.12.RELEASE\spring-aop-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-beans\4.3.12.RELEASE\spring-beans-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-context\4.3.12.RELEASE\spring-context-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-webmvc\4.3.12.RELEASE\spring-webmvc-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-expression\4.3.12.RELEASE\spring-expression-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-framework\2.9.1\curator-framework-2.9.1.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-client\2.9.1\curator-client-2.9.1.jar;D:\apache-maven-3.8.1\Repository\org\apache\zookeeper\zookeeper\3.4.6\zookeeper-3.4.6.jar;D:\apache-maven-3.8.1\Repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;D:\apache-maven-3.8.1\Repository\jline\jline\0.9.94\jline-0.9.94.jar;D:\apache-maven-3.8.1\Repository\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;D:\apache-maven-3.8.1\Repository\com\google\guava\guava\16.0.1\guava-16.0.1.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-recipes\2.9.1\curator-recipes-2.9.1.jar" com.testcode.timeout.TimeOutTest
获取学生姓名------开始
callable完成
获取学生姓名------结束, rtn=1

Process finished with exit code 0//这行在60秒之后才打印,主线程结束

 由于这里使用默认构造函数创建 SimpleTimeLimiter 时 - 他会创建您无法控制的自己的 Executors.newCachedThreadPool(),所以要等待60秒之后主程序才会结束

... Threads that have not been used for sixty seconds are terminated and removed from the cache....

 

主动关闭ExecutorService

如果您创建自己的 ExecutorService 并使用此 executorService 创建 SimpleTimeLimiter,那么您可以在关闭 Hook 上关闭 executorService。

在执行代码完成后调用

System.out.println("获取学生姓名------结束, rtn="+rtn);
System.out.println("关闭ExecutorService开始");
shutdown(executor);
System.out.println("关闭ExecutorService完成");
public void shutdown(ExecutorService executor) {
        if (executor == null || executor.isShutdown()) {
            return;
        }
        executor.shutdown();
        try {
            System.out.println("awaitTermination开始");
            executor.awaitTermination(5, TimeUnit.SECONDS);
            System.out.println("awaitTermination完成");
        } catch (InterruptedException e) {
            System.out.println("Interrupted during executor termination." + e);
            Thread.currentThread().interrupt();
        }
        executor.shutdownNow();
    }

日志打印:

"D:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\Program Files\IntelliJ IDEA 2020.1.4\lib\idea_rt.jar=8414:D:\Program Files\IntelliJ IDEA 2020.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;E:\AsiaWork\workspace\SpringBootFjm\target\classes;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-web\1.5.8.RELEASE\spring-boot-starter-web-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter\1.5.8.RELEASE\spring-boot-starter-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot\1.5.8.RELEASE\spring-boot-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-autoconfigure\1.5.8.RELEASE\spring-boot-autoconfigure-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-logging\1.5.8.RELEASE\spring-boot-starter-logging-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;D:\apache-maven-3.8.1\Repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-core\4.3.12.RELEASE\spring-core-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;D:\apache-maven-3.8.1\Repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.8.RELEASE\spring-boot-starter-tomcat-1.5.8.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.23\tomcat-embed-core-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\tomcat-annotations-api\8.5.23\tomcat-annotations-api-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.23\tomcat-embed-el-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.23\tomcat-embed-websocket-8.5.23.jar;D:\apache-maven-3.8.1\Repository\org\hibernate\hibernate-validator\5.3.5.Final\hibernate-validator-5.3.5.Final.jar;D:\apache-maven-3.8.1\Repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;D:\apache-maven-3.8.1\Repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-databind\2.8.10\jackson-databind-2.8.10.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;D:\apache-maven-3.8.1\Repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-web\4.3.12.RELEASE\spring-web-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-aop\4.3.12.RELEASE\spring-aop-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-beans\4.3.12.RELEASE\spring-beans-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-context\4.3.12.RELEASE\spring-context-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-webmvc\4.3.12.RELEASE\spring-webmvc-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\springframework\spring-expression\4.3.12.RELEASE\spring-expression-4.3.12.RELEASE.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-framework\2.9.1\curator-framework-2.9.1.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-client\2.9.1\curator-client-2.9.1.jar;D:\apache-maven-3.8.1\Repository\org\apache\zookeeper\zookeeper\3.4.6\zookeeper-3.4.6.jar;D:\apache-maven-3.8.1\Repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;D:\apache-maven-3.8.1\Repository\jline\jline\0.9.94\jline-0.9.94.jar;D:\apache-maven-3.8.1\Repository\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;D:\apache-maven-3.8.1\Repository\com\google\guava\guava\16.0.1\guava-16.0.1.jar;D:\apache-maven-3.8.1\Repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\apache-maven-3.8.1\Repository\org\apache\curator\curator-recipes\2.9.1\curator-recipes-2.9.1.jar" com.testcode.timeout.TimeOutTest
获取学生姓名------开始
callable完成
获取学生姓名------结束, rtn=1
关闭ExecutorService开始
awaitTermination开始
awaitTermination完成
关闭ExecutorService完成

Process finished with exit code 0

其中showdown、shutdownNow、awaitTermination差别和使用参考

(5条消息) ThreadPoolExecutor 中的 shutdown() 、shutdownNow() 、awaitTermination() 的用法和区别_thetimelyrain的博客-CSDN博客

 

 

参考:

java - SimpleTimeLimiter 超时 - 关闭应用程序需要很长时间 - IT工具网 (coder.work)

(5条消息) SpringBoot :异步开发之异步请求(1)_springboot callable回调_OkidoGreen的博客-CSDN博客

(5条消息) 如何控制方法的调用Timeout超时,并主动中断调用请求_java 调用方法超时_java小姜在线冲的博客-CSDN博客T

posted @ 2023-04-27 10:24  疯狂的草  阅读(227)  评论(0)    收藏  举报