java并发interrupt 两阶段终止 ---- 监控案例

    技术2022-07-11  111

    package com.ts.concurrent.mthread; import lombok.Data; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit; /** * @author yanjun.liu * @date 2020/7/1--18:06 * * 多线程两阶段终止案例 */ @Data @Slf4j public class MyInterrupt { public static void main(String[] args) throws InterruptedException { //创建监控对象 Monitor monitor= new Monitor(); //开启监控 monitor.start(); //主线程睡觉5秒,先监控一会,然后在停止 TimeUnit.SECONDS.sleep(5); //停止监控 monitor.stop(); } //监控类 public static class Monitor { //监控线程 private Thread monitorThread; //开启监控线程 public void start(){ monitorThread=new Thread(()->{ //执行run方法 while (true){ //获得当前线程 Thread thread = Thread.currentThread(); if(thread.isInterrupted()){ log.debug("{}:线程要停止监控了,",Thread.currentThread().getName()); log.info("退出之前,处理善后工作"); break; } try { //睡眠一会,降低cpu使用率(单cpu,多的应该不影响) //阻塞睡眠期间可能被调用interrupt打断,(阻塞期间调用,会发生异常并将interrupt的值至为false, // 需要在catch中重新设置interrupt为true) TimeUnit.SECONDS.sleep(1); //正常处理业务逻辑时,也可能可调用interrupt打断,标志为true,可以正常退出 log.info("处理监控业务逻辑。。。。"); }catch (InterruptedException e){ e.printStackTrace(); //重新设置打断标记,至为true thread.interrupt(); } } },"监控"); monitorThread.start(); } //停止监控线程的方法 public void stop(){ monitorThread.interrupt(); } } }

    输出

    D:\jdk1.8\bin\java.exe "-javaagent:D:\IntelliJ IDEA 2020.1.1\lib\idea_rt.jar=62846:D:\IntelliJ IDEA 2020.1.1\bin" -Dfile.encoding=UTF-8 -classpath D:\jdk1.8\jre\lib\charsets.jar;D:\jdk1.8\jre\lib\deploy.jar;D:\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\jdk1.8\jre\lib\ext\cldrdata.jar;D:\jdk1.8\jre\lib\ext\dnsns.jar;D:\jdk1.8\jre\lib\ext\jaccess.jar;D:\jdk1.8\jre\lib\ext\jfxrt.jar;D:\jdk1.8\jre\lib\ext\localedata.jar;D:\jdk1.8\jre\lib\ext\nashorn.jar;D:\jdk1.8\jre\lib\ext\sunec.jar;D:\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\jdk1.8\jre\lib\ext\zipfs.jar;D:\jdk1.8\jre\lib\javaws.jar;D:\jdk1.8\jre\lib\jce.jar;D:\jdk1.8\jre\lib\jfr.jar;D:\jdk1.8\jre\lib\jfxswt.jar;D:\jdk1.8\jre\lib\jsse.jar;D:\jdk1.8\jre\lib\management-agent.jar;D:\jdk1.8\jre\lib\plugin.jar;D:\jdk1.8\jre\lib\resources.jar;D:\jdk1.8\jre\lib\rt.jar;E:\guide\concurrent\target\classes;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.3.1.RELEASE\spring-boot-starter-web-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-starter\2.3.1.RELEASE\spring-boot-starter-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot\2.3.1.RELEASE\spring-boot-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.1.RELEASE\spring-boot-autoconfigure-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.3.1.RELEASE\spring-boot-starter-logging-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\95303\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\95303\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;C:\Users\95303\.m2\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;C:\Users\95303\.m2\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;C:\Users\95303\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\95303\.m2\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.3.1.RELEASE\spring-boot-starter-json-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.11.0\jackson-databind-2.11.0.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.0\jackson-annotations-2.11.0.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.11.0\jackson-core-2.11.0.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.0\jackson-datatype-jdk8-2.11.0.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.0\jackson-datatype-jsr310-2.11.0.jar;C:\Users\95303\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.0\jackson-module-parameter-names-2.11.0.jar;C:\Users\95303\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.1.RELEASE\spring-boot-starter-tomcat-2.3.1.RELEASE.jar;C:\Users\95303\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.36\tomcat-embed-core-9.0.36.jar;C:\Users\95303\.m2\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;C:\Users\95303\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.36\tomcat-embed-websocket-9.0.36.jar;C:\Users\95303\.m2\repository\org\springframework\spring-web\5.2.7.RELEASE\spring-web-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-beans\5.2.7.RELEASE\spring-beans-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-webmvc\5.2.7.RELEASE\spring-webmvc-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-aop\5.2.7.RELEASE\spring-aop-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-context\5.2.7.RELEASE\spring-context-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-expression\5.2.7.RELEASE\spring-expression-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;C:\Users\95303\.m2\repository\org\springframework\spring-core\5.2.7.RELEASE\spring-core-5.2.7.RELEASE.jar;C:\Users\95303\.m2\repository\org\springframework\spring-jcl\5.2.7.RELEASE\spring-jcl-5.2.7.RELEASE.jar com.ts.concurrent.mthread.MyInterrupt 18:44:44.280 [监控] INFO com.ts.concurrent.mthread.MyInterrupt - 处理监控业务逻辑。。。。 18:44:45.283 [监控] INFO com.ts.concurrent.mthread.MyInterrupt - 处理监控业务逻辑。。。。 18:44:46.284 [监控] INFO com.ts.concurrent.mthread.MyInterrupt - 处理监控业务逻辑。。。。 18:44:47.284 [监控] INFO com.ts.concurrent.mthread.MyInterrupt - 处理监控业务逻辑。。。。 java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at com.ts.concurrent.mthread.MyInterrupt$Monitor.lambda$start$0(MyInterrupt.java:51) at java.lang.Thread.run(Thread.java:748) 18:44:48.278 [监控] DEBUG com.ts.concurrent.mthread.MyInterrupt - 监控:线程要停止监控了, 18:44:48.281 [监控] INFO com.ts.concurrent.mthread.MyInterrupt - 退出之前,处理善后工作 Process finished with exit code 0
    Processed: 0.010, SQL: 9