主要区别如下:
1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度,同时,notify方法也不会释放锁,在下面例子程序中说明);
2、sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;
例子程序:
/** * 测试程序演示sleep与wait方法的区别 * 主要有以下几点区别: * 1、这两个方法来自不同的类分别是Thread(sleep)和Object(wait); * 2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法,见本程序示例; * 3、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 * @author cdzhujun */ public class TestSleepAndWait { private static class Thread1 implements Runnable{ @Override public void run() { //由于 Thread1和下面Thread2内部run方法要用同一对象作为监视器,如果用this则Thread1和Threa2的this不是同一对象 //所以用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时指向的都是同一个对象 synchronized(TestSleepAndWait.class){ System.out.println("enter thread1 ..."); System.out.println("thread1 is waiting"); try{ //释放锁有两种方式:(1)程序自然离开监视器的范围,即离开synchronized关键字管辖的代码范围 //(2)在synchronized关键字管辖的代码内部调用监视器对象的wait()方法。这里使用wait方法 TestSleepAndWait.class.wait(); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("thread1 is going on ..."); System.out.println("thread1 is being over!"); } } } private static class Thread2 implements Runnable{ @Override public void run() { //notify方法并不释放锁,即使thread2调用了下面的sleep方法休息6000ms,但thread1仍然不会执行 //因为thread2没有释放锁,所以Thread1得不到锁而无法执行 synchronized(TestSleepAndWait.class){ System.out.println("enter thread2 ..."); System.out.println("thread2 notify other thread can release wait status ..."); TestSleepAndWait.class.notify(); System.out.println("thread2 is sleeping ten millisecond ..."); try{ Thread.sleep(6000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println("thread2 is going on ..."); System.out.println("thread2 is being over!"); } } } public static void main(String[] args) { new Thread(new Thread1()).start(); try{ Thread.sleep(10); }catch(InterruptedException e){ e.printStackTrace(); } new Thread(new Thread2()).start(); } }
程序执行结果为:
enter thread1 ... thread1 is waiting enter thread2 ... thread2 notify other thread can release wait status ... thread2 is sleeping ten millisecond ... thread2 is going on ... thread2 is being over! thread1 is going on ... thread1 is being over!
相关推荐
sleep() 方法和 wait() 方法都是 Java 中的线程控制方法,但是它们有着本质的区别。下面是对这两种方法的详细比较和分析。 sleep() 方法 sleep() 方法是 Thread 类的静态方法,它的主要作用是使当前线程进入停滞...
### Java中的sleep()与wait()方法详解 #### 一、Java sleep()方法解析 ##### 1.1 方法定义与用途 `sleep()`方法是Thread类中的一个静态方法,用于让当前正在执行的线程暂停执行指定的时间(毫秒),之后线程将重新...
### Java中的sleep与wait详解 #### 一、概述 在Java多线程编程中,`Thread.sleep()` 和 `Object.wait()` 是两个非常重要的方法,它们分别位于 `Thread` 类和 `Object` 类中,用于控制线程的行为。本文将深入探讨这...
### Sleep与Wait的区别详解 #### 一、基本概念 在多线程编程中,`sleep`和`wait`是两个非常重要的方法,用于控制线程的执行和协调多个线程之间的交互。理解这两个方法的不同之处对于正确实现多线程程序至关重要。 ...
Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...
wait方法与sleep和suspend方法的主要区别在于,wait方法可以释放锁,而sleep和suspend方法不能释放锁。wait方法可以让当前线程暂时放弃对象锁,让其他线程使用,而sleep和suspend方法不能做到这一点。 结论 在Java...
`sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...
wait()和sleep()方法都是Java多线程编程中重要的概念,它们之间的区别在于线程同步和执行时间控制。我们需要根据实际情况选择合适的方法来实现多线程同步和控制线程的执行时间。 资源详解: 1. wait()方法和...
Java线程中的`sleep()`和`wait()`方法都是在多线程环境中用于控制线程执行的重要工具,但它们之间存在着显著的区别。理解这些差异对于编写高效、正确的并发代码至关重要。 首先,Java的多线程机制基于抢占式模型,...
在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两个方法的详细解释: 1. **`Thread.sleep(long milliseconds)`** - `sleep()` 方法是...
本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...
本文将深入探讨`wait()`, `notify()`以及它们与`sleep()`方法的区别,这些都是Java中与线程同步密切相关的概念。 首先,`wait()`, `notify()`和`notifyAll()`是Object类中的方法,它们主要用于线程间通信和协作。...
本篇文章将详细介绍JAVA线程sleep()和wait()的原理、区别和实现机制,并提供实例代码以便更好地理解这两个方法。 一、sleep()方法 sleep()方法是Thread类的一个静态方法,使得Runnable实现的线程也可以使用sleep...
在Java编程中,`sleep()` 和 `wait()` 都是用来控制线程的执行流程,但它们之间存在着显著的区别。理解这些差异对于编写多线程程序至关重要。 `sleep()` 是 `java.lang.Thread` 类的一个静态方法,它使得当前正在...
本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
在Java编程语言中,`sleep()` 和 `wait()` 都是用来控制线程执行的重要方法,但它们的作用和使用场景有着显著的区别。以下是这两者详细的区别和解析: 1. **所属类不同**: - `sleep()` 方法是 `java.lang.Thread`...
"高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别" 本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要...
本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...
本文总结了Java多线程与并发系列的22道高频面试题,涵盖了多线程的实现方法、线程停止、notify和notifyAll的区别、sleep和wait的区别、volatile关键字的作用等多方面的知识点。 一、Java中实现多线程的方法 Java中...