多线程学习——sleep和wait

sleep:睡眠,让出CPU但是不释放锁住的对象,经过指定时间后进入就绪状态。

wait:等待,让出CPU并且释放锁住的对象,经过设定时间进入就绪状态,不设定时间则需要notify或notifyAll唤醒,否则一直处于挂起状态。

yield:退让,大叫一声,有没有和我差不多或比我还牛逼的人啊,有的话我们一起竞争啊,和sleep(0)差不多,但是sleep(0)可以让不如自己的人一起竞争。

notify/notifyAll:唤醒,叫起正在wait的人,notify叫一个,notifyAll叫所有。

join:加入,在一个线程中加入另一个线程,相当于 thread.wait(),B加入A,B执行完再执行A。

这篇文章讲的join我还能看懂。。。https://www.cnblogs.com/lcplcpjava/p/6896904.html

sleep和wait用法

张三和李四同时要去洗碗,张三先抢到了水池。洗着洗着张三突然想睡觉,此时张三的洗碗动作要中断,两种中断办法:

sleep:我要去睡觉啦,李四你不能用我的水池啊,等我睡醒了我还要继续洗碗呢!

wait:我要去睡觉啦,李四你先洗碗吧,你过会叫我起来或者你洗完了叫我起来啊!

sleep

	public static String POOL = "水池";
	public static void main(String[] args) {
		Thread zhangsan = new Thread(new Runnable() {
			public void run() {
				synchronized(TestThread.POOL){
					try {
						System.out.println("张三抢到水池,张三开始洗碗。。。");
						System.out.println("张三想睡觉张三说:我要去睡觉啦,李四你不能用我的水池啊,等我睡醒了我还要继续洗碗呢!");
						Thread.sleep(3000);
						System.out.println("张三睡醒继续洗碗");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("张三洗碗结束");
				}
			}
		});
		Thread lisi = new Thread(new Runnable() {
			public void run() {
				synchronized(TestThread.POOL){
					System.out.println("李四抢到水池,李四开始洗碗。。。");
					System.out.println("李四洗碗结束");
				}
			}
		});
		System.out.println("张三和李四准备洗碗。。。。。。");
		zhangsan.start();
		lisi.start();
	}

运行结果:

张三和李四准备洗碗。。。。。。
张三抢到水池,张三开始洗碗。。。
张三想睡觉张三说:我要去睡觉啦,李四你不能用我的水池啊,等我睡醒了我还要继续洗碗呢!
张三睡醒继续洗碗
张三洗碗结束
李四抢到水池,李四开始洗碗。。。
李四洗碗结束

wait

	public static String POOL = "水池";
	public static void main(String[] args) {
		Thread zhangsan = new Thread(new Runnable() {
			public void run() {
				synchronized(TestThread.POOL){
					try {
						System.out.println("张三抢到水池,张三开始洗碗。。。");
						System.out.println("张三想睡觉张三说:我要去睡觉啦,李四你先洗啊,洗完叫我!");
						TestThread.POOL.wait();
						System.out.println("李四叫醒张三,张三继续洗碗!");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("张三洗碗结束");
				}
			}
		});
		Thread lisi = new Thread(new Runnable() {
			public void run() {
				synchronized(TestThread.POOL){
					System.out.println("李四抢到水池,李四开始洗碗。。。");
					System.out.println("李四洗碗结束");
					TestThread.POOL.notify();
				}
			}
		});
		System.out.println("张三和李四准备洗碗。。。。。。");
		zhangsan.start();
		lisi.start();
	}

 运行结果:

张三和李四准备洗碗。。。。。。
张三抢到水池,张三开始洗碗。。。
张三想睡觉张三说:我要去睡觉啦,李四你先洗啊,洗完叫我!
李四抢到水池,李四开始洗碗。。。
李四洗碗结束
李四叫醒张三,张三继续洗碗!
张三洗碗结束

注意点: 

如果李四不唤醒张三,则张三一直睡。

张三可以自己设定睡觉时间,时间到了等李四洗完他继续洗。

sleep属于线程类,wait、notify、notifyAll属于对象类,所以sleep在哪个线程用,就哪个线程睡。

wait和notify/notifyAll必须在synchronized的代码块中,并且操作的对象必须synchronized。

notify唤醒第一个相关线程,notifyAll唤醒所有相关线程,唤醒后也要先获得锁才能继续运行。

猜你喜欢

转载自blog.csdn.net/qq_35321596/article/details/81315811