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唤醒所有相关线程,唤醒后也要先获得锁才能继续运行。