23(多线程2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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总结

对于同步代码块或者同步方法,他们中的对象必须要是相同的对象才可以是的线程安全,好比方说,锁就是话筒,只有一个话筒,只有一个人拿到了话筒,他才可以说话。

猜你喜欢

转载自blog.csdn.net/Haidaiya/article/details/82986282