sleep与wait的区别:
1、sleep()是Thread类的Static(静态)的方法,不释放对象锁,其他线程无法访问这个对象;
2、wait()是Object类里的方法,线程的执行被挂起,释放对象锁,该对象的其他synchronized方法在wait期间被调用;直到其他对象调用同一对象的notify(notifyAll)方法唤醒等待池中的线程;
3、wait,notify和notifyAll只能放在同步控制方法或同步块里,sleep可以在任何地方使用;
4、sleep必须捕获异常,wait不用
wait,notify和notifyAll为什么只能放在同步控制方法或同步块synchronized里?
只能在同步控制方法和同步控制块调用wait(),因为调用这些方法前必须“拥有“对象的锁,同步方法可以获取对象锁;
Sleep可以在任何地方使用,因为不需要操作对象锁。
package corelesson1;public class TestD { public static void main(String[] args) { new Thread(new Thread1()).start(); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } new Thread(new Thread2()).start(); } private static class Thread1 implements Runnable { @Override public void run() { synchronized (TestD.class) { System.out.println("enter thread1..."); System.out.println("thread1 is waiting..."); try { // 调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池31 TestD.class.wait(); } catch (Exception e) { e.printStackTrace(); } System.out.println("thread1 is going on ...."); System.out.println("thread1 is over!!!"); } } } private static class Thread2 implements Runnable { @Override public void run() { synchronized (TestD.class) { System.out.println("enter thread2...."); System.out.println("thread2 is sleep...."); // 只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态。48 // TestD.class.notify(); // //================== // //区别 // //如果我们把代码:TestD.class.notify();给注释掉,即TestD.class调用了wait()方法,但是没有调用notify() // //方法,则线程永远处于挂起状态。53 // try { // //sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程, // //但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。 // //在调用sleep()方法的过程中,线程不会释放对象锁。57 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("thread2 is going on...."); System.out.println("thread2 is over!!!"); } }}
运行效果:
enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!thread1 is going on ....thread1 is over!!!
如果注释掉代码:
1 TestD.class.notify();
运行效果:
enter thread1...thread1 is waiting...enter thread2....thread2 is sleep....thread2 is going on....thread2 is over!!!
且程序一直处于挂起状态。