sleep
- 1.sleep作用让当前线程暂停指定的时间
- 2.sleep只是暂时让出CPU执行权限,并不释放锁
- 3.sleep由于对象锁没有被释放,其他线程仍然无法访问这个对象
- 4.sleep不需要在同步的代码块中执行(wait方法必须在同步的代码块中执行)
- 5.sleep可以用interrupt方法打断线程的暂停状态
- 6.sleep只是线程的操作,用于短时间暂停线程,不涉及线程间通信
- 7.sleep是Thread类的方法
wait
- 1.wait()/notify()方法通常成对出现
- 2.wait()/notify()方法需要获取对象锁方可调用
- 3.wait()/notify()要写在同步代码块或者同步方法内
- 4.一旦调用wait()方法,其他线程将可以访问这个对象
- 5.当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁,可以允许其他的线程执行一些同步操作
- 6.wait()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出中断异常
- 7.重获对象锁:a)设置wait()方法的参数,如wait(1000)表明借出去1秒钟后,自动收回锁b)让借锁的线程通知(notify)当前线程,借锁线程用完了马上就收回来
- 8.wait()/notify()是Object的方法
notify/notifyall
- 1.notify()唤醒在此对象监视器(对象锁)上等待的单个线程
- 2.当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中
- 3.该线程将等待从锁池中获得锁,然后回到wait()前的现场
- 4.notifyAll()唤醒在此对象监视器上等待的所有线程
- 5.唤醒的线程的顺序—LIFO
- 6.wait()/notify()/notifyAll()涉及线程间的通信
例子:
package com.hexy.thread.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ThreadDemo10 {
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public static void main(String[] args) {
Object obj = new Object();
for (int i = 0; i < 5; i++) {
new WaitThread(i,obj).start();
}
new NotifyThread(obj).start();
}
static class WaitThread extends Thread{
Object obj;
public WaitThread(int i,Object obj) {
setName("WaitThread"+i);
this.obj = obj;
}
@Override
public void run(){
synchronized (obj){
System.out.println(sdf.format(new Date() ) + "" + getName()+ " before wait()");
try{
obj.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(sdf.format(new Date() )+ "" + getName()+ " after wait()");
}
}
}
static class NotifyThread extends Thread{
Object obj;
public NotifyThread(Object obj) {
setName("NotifyThread");
this.obj = obj;
}
@Override
public void run(){
synchronized (obj){
try{
Thread.sleep(5000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(sdf.format(new Date()) + " notifythread before notify()");
obj.notifyAll();
try{
Thread.sleep(5000);
}catch (Exception e){
e.printStackTrace();
}
System.out.println(sdf.format(new Date() )+ " notifythread after notify()");
}
}
}
}