sleep()和wait()的区别
sleep()和wait()的区别:
首先sleep()是Thread类的方法,wait()是Object类中定义的方法。
主要有以下几点区别:
1.当线程调用sleep()进入休眠时,不会释放对象锁;而调用wait()进入休眠时,会释放对象锁;
2.sleep()方法可以在任何地方调用,而wait()只能在synchronized修饰的函数或者代码块中调用;
线程状态:
举一个栗子:
public class ThreadB extends Thread{
int total;
@Override
public void run() {
super.run();
//锁住ThreadB对象
synchronized (this){
System.out.println("ThreadB is runing..");
for (int i=0 ; i<100000;i++){
total += 1;
System.out.println("total is :"+total);
}
notifyAll();
}
}
}
public class Wait {
public static void main(String[] args){
//创建线程B
ThreadB b = new ThreadB();
//线程B运行
b.start();
System.out.println("thread b is start...");
//括号里的b是什么意思,起什么作用?
synchronized (b){
try {
System.out.println("Waiting for b to complete...");
/*
* 1.(wait)同时又“积极”地等待条件发生改变
* 2.它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人(这里应该是程序块,或线程)用
* 3.只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程还是要把这个对象锁收回来的呀
* */
b.wait();
System.out.println("Completed.Now back to main thread");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Totle is :"+b.total);
}
}
1.(wait)同时又“积极”地等待条件发生改变
2.它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人(这里应该是程序块,或线程)用
3.只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程还是要把这个对象锁收回来的呀