Thread 类中的:sleep(),join(),wait(),yield()区别详解

1. sleep():
  • Thread.sleep(1000);
  • 在指定时间内让当前执行的线程暂停执行一段时间,让其他线程有机会继续执行,但不会释放对象锁,也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据,不推荐使用,sleep() 使当前线程进入阻塞状态,在指定时间不会执行。
2. wait():
  • 对象的方法,会释放对象锁
  • wait()和notify()、notifyAll(),这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用也就是说,调用wait(),notify()和notifyAll()的任务在调用这些犯法前必须拥有对象锁
  • wait()和notify()、notifyAll()它们都是Object类的方法,而不是Thread类的方法。
  • 当调用某一对象的wait() 方法后,会使当前线程暂停执行,并将当前线程放入对象等待池中,直到调用 notify() 方法后,将从对象等待池中移出任意一个线程并放入锁标志等待池中,只有锁标志等待池中的线程可以获得锁标志,他们随时准备争夺锁的拥有权,当调用了某个对象的notifyAll() 方法,会将对象等待池中的所有线程都移动到该对象的锁标志等待池
  1. wait():调用该方法使持有该对象的线程把该对象的控制权交出去,然后处于等待状态
  2. notify():调用该方法就会通知某个正在等待这个对象的控制权的线程可以继续运行
  3. notifyAll():调用该方法就会通知所有等待这个对象控制权的线程继续运行
3. yield():
  • Thread类的静态方法,不会释放对象锁,不抛异常
  • yield() 方法和sleep() 方法类似,也不会释放对象锁,它是Thread类的静态方法,区别在于,它没有参数,即yield() 方法只是使当前线程让步,重新回到就绪状态,所以执行yield的线程,有可能在进入到就绪状态后马上又被执行,另外yield方法只能使同优先级或者高优先级的线程得到执行机会,这也和sleep方法不同
4. join():
  • Thread 类的对象实例的方法
  • Thread t1 = new Thread();t1.join();
  • join() 方法会使当前线程等待调用join()方法的县城结束后才能继续执行

你可能感兴趣的:(开发,多线程,jvm,常见问题)