java多线程之sleep与wait

区别

sleep

  • sleep是Thread类的静态方法随时调用
  • sleep在调用时不会释放所持有的锁

wait

  • wait是对象的方法
  • wait会释放锁
  • 在调用notify唤醒wait时候,notify作用域必须持有在调用wait时候所加的锁
  • notify后并不会立即唤醒,等到获得原环境时候有唤醒条件

代码

public class ConcurrentTest {
  static final Object lock = new Object();

  public static void main(String[] args) throws InterruptedException {
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("t1 is waiting to get lock");
        synchronized (lock){
          System.out.println("t1 get lock");
          try {  // sleep does not lose lock
            System.out.println("t1 sleep start");
            Thread.sleep(3000);
            System.out.println("t1 sleep end");
            System.out.println("t1 wait start");
            lock.wait();
            System.out.println("t1 wait end");
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    });
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("t2 is waiting to get lock");
        synchronized (lock){  // t2将在t1 wait时候获取锁
          System.out.println("t2 get lock, t2 attempt to notify t1");
          lock.notify();
          try {
            System.out.println("t2 keep lock, sleep start");
            Thread.sleep(3000);
            System.out.println("t2 sleep end, release lock");
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    });
    t1.start();
    Thread.sleep(10);
    t2.start();
  }
}

/**
	运行结果:
	t1 is waiting to get lock
	t1 get lock
	t1 sleep start
	t2 is waiting to get lock
	t1 sleep end
	t1 wait start
	t2 get lock, t2 attempt to notify t1
	t2 keep lock, sleep start
	t2 sleep end, release lock
	t1 wait end

Process finished with exit code 0
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值