package cn.itcast.thread;
/*
线程的停止:
1. 停止一个线程 我们一般都会通过一个变量去控制的。
2. 如果需要停止一个处于等待状态下的线程,那么我们需要通过变量配合notify方法或者interrupt()来使用。
*/


public class Demo6 extends Thread {

boolean flag = true;

public Demo6(String name){
super(name);
}


@Override
public synchronized void run() {
int i = 0 ;
while(flag){
try {
this.wait(); //狗娃等待..

} catch (InterruptedException e) {
System.out.println("接收到了异常了....");
}
System.out.println(Thread.currentThread().getName()+":"+i);
i++;
}
}



public static void main(String[] args) {
Demo6 d = new Demo6("狗娃");
d.setPriority(10);
d.start();

for(int i = 0 ; i<100 ; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
//当主线程的i是80的时候停止狗娃线程。
//d.interrupt(); // interrupt()根本就是无法停止一个线程。
if(i==80){
d.flag = false;
d.interrupt(); //把线程的等待状态强制清除,被清除状态的线程会接收到一个InterruptedException。
/*synchronized (d) {
d.notify();
}*/


}

}


}

}
package cn.itcast.thread;
/*
守护线程(后台线程):在一个进程中如果只剩下 了守护线程,那么守护线程也会死亡,主线程结束,则守护线程也结束

需求: 模拟QQ下载更新包。

一个线程默认都不是守护线程。

*/
public class Demo7 extends Thread {

public Demo7(String name){
super(name);
}

@Override
public void run() {
for(int i = 1 ; i<=100 ; i++){
System.out.println("更新包目前下载"+i+"%");
if(i==100){
System.out.println("更新包下载完毕,准备安装..");
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
Demo7 d = new Demo7("后台线程");
d.setDaemon(true); //setDaemon() 设置线程是否为守护线程,true为守护线程, false为非守护线程。
// System.out.println("是守护线程吗?"+ d.isDaemon()); //判断线程是否为守护线程。
d.start();

for(int i = 1 ; i<=100 ; i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}

}

}