/**
* <p>Title: Demo3.java</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2017</p>
* <p>Company: www.baidudu.com</p>
* @author shenlan
* @date 2019年1月19日
* @version 1.0
*/
package test;
import java.util.concurrent.TimeUnit;
/**
* @Title: Demo3.java
* @Description:模擬:建立主執行緒(使用者執行緒)中建立一個子執行緒為守護執行緒,執行main方法(使用者執行緒)
* –斷點測試..執行main方法,啟動主執行緒(不結束main(使用者執行緒))
* ==輸出..執行一次主執行緒,由於main方法(使用者執行緒)未結束,守護執行緒每秒輸出一次(守護執行緒守護的是使用者執行緒)
* –正常模式..
* ==輸出..主執行緒執行一次,守護執行緒執行一次,只有由於使用者執行緒結束,JVM退出,守護執行緒結束
* //將(子執行緒)守護執行緒改為使用者執行緒時,主執行緒結束,主執行緒中的子執行緒一直執行(每秒執行一次)
*
* 注意 :不是說當前子執行緒是守護執行緒,主執行緒結束,子執行緒就跟著結束,前提條件是:當JVM應用例項中沒有應用執行緒繼續執行,如果有其他使用者執行緒繼續執行,那麼後臺執行緒不會中斷.
* @Copyright: **科技 (c) 2018
* @Company: **科技
* @author **
* @date 2019年1月19日
* @version 1.0
*/
public class Demo3 {
public static void main(String[] args) {
Thread mainThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Thread childrenThread = new Thread(new ChildrenThread());
childrenThread.setDaemon(true);
// –守護執行緒必須在啟動執行緒之前操作
childrenThread.start();
System.out.println(“I`m main thread.”);
}
});
mainThread.start();
}
}
class ChildrenThread implements Runnable{
@Override
public void run() {
while (true) {
System.out.println(“I`m children thread.”);
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}