版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haidaiya/article/details/82986282
1 休眠线程
2 守护线程
这个概念需要解释一下,以象棋为例,非守护线程相当于帅,守护线程相当于车马相士,当帅都没了,车马相士就失去了它的意义了,就是非守护线程停止了,守护线程也就gg了。
结果就是aaaa不会输出50次了。
3 加入线程(插队线程)
4 礼让线程和设置优先级setPriority()
5 同步代码块
同步代码块这里也需要解释一下,有的时候回发生一件事情,在一个线程中,代码还么有完全执行结束,就被另外一个线程抢占过去,所以就需要使得这个线程中的代码执行完毕,就加上一把锁,也就是上图的代码的示意。
6 同步方法
声明为同步方法,保证是一把锁,才会使得进程之间不会出错。锁对象的概念很重要。
7 线程安全问题(火车售票)
package com.haidai.thread;
/*
* 线程安全问题:火车卖票问题
* 100张票,4个窗口卖票
*/
public class Demo7 {
public static void main(String[] args) {
new Ticket().start();
new Ticket().start();
new Ticket().start();
new Ticket().start();
}
}
class Ticket extends Thread {
private static int num = 100;
@Override
public void run() {
while (true) {
synchronized (Ticket.class) {
if (num <= 0) {
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + "号窗口售:这是第 " + (num--) + " 号票");
}
}
}
}
需要在卖票的代码加上·同步锁,这样不会出错。
package com.haidai.thread;
public class Demo8 {
public static void main(String[] args) {
MyTicket mt = new MyTicket();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
}
}
class MyTicket implements Runnable{
private int num = 100;
@Override
public void run() {
while (true) {
synchronized (Ticket.class) {
if (num <= 0) {
break;
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "号窗口售:这是第 " + (num--) + " 号票");
}
}
}
}
8 死锁
哲学家只有一只筷子的故事,2个人拿着对方的资源不释放,于是死锁了,为了避免同步代码块死锁,就不要嵌套同步代码块
9总结
对于同步代码块或者同步方法,他们中的对象必须要是相同的对象才可以是的线程安全,好比方说,锁就是话筒,只有一个话筒,只有一个人拿到了话筒,他才可以说话。