守护线程
线程分为:
- 守护线程
守护用户线程,当最后一个用户线程结束时,所有守护线程自动死亡
- 用户线程
直接创建的线程就是用户线程,当所有用户线程结束时,程序结束
setDaemon()方法,传true既守护线程
package xc;
public class Demo7 {
public static void main(String[] args) {
//守护线程:
Thread t1 = new Thread(new Demo6.Myrunnable());
t1.setDaemon(true);//是守护线程
t1.start();
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
//在run里不能进行异常的抛出,因为接口没有声明异常的抛出
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Myrunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
//在run里不能进行异常的抛出,因为接口没有声明异常的抛出
try {
Thread.sleep(1000);//进行休眠时会检查是否携带中断标记
} catch (InterruptedException e) {
//线程中断异常
}
}
}
}
}
线程安全
卖票!
package xc;
public class Demo8 {
public static void main(String[] args) {
Runnable t = new Ticket();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
static class Ticket implements Runnable{
//票数
private int count = 10;
@Override
public void run() {
while (count > 0){
System.out.println("正在买票");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
System.out.println("卖票成功,还有票数:"+count);
}
}
}
}
输出:
剩余-2张,显然是有问题的
执行流程图:
A、B、C三个用户抢时间篇,因为在run方法中有1秒的停留,此时时间篇可能会换用户,导致三个用户都进入了while循环,产生-2。