java 併發interrupt 兩階段終止 ---- 監控案例

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章