JAVA线程sleep与wait区别

简介: sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过后,cpu才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了cpu,但其他被同步锁挡住了的线程也无法得到执行。

wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放。如果notify方法后面的代码还有很多,需要这些代码执行完后才会释放锁,可以在notfiy方法后增加一个等待和一些代码,看看效果),调用wait方法的线程就会解除wait状态和程序可以再次得到锁后继续向下运行。

测试代码:

public class MyThread1 implements Runnable {

	/*
	 *  由于这里的MyThread1和下面的MyThread2内部run方法要用同一对象作为监视器,我们这里不能用this,因为在MyThread2里面的this和这个MyThread1的this不是同一个对象。
	 *  我们用MultiThread.class这个字节码对象,当前虚拟机里引用这个变量时,指向的都是同一个对象。
	 */
	public void run() {
		synchronized (MutiThread.class) {
			System.out.println("进入MyThread1...");
			System.out.println("MyThread1 is waiting...");
			
			try {
				// 释放锁有两种方式,第一种方式是程序自然离开监视器的范围,也就是离开了synchronized关键字管辖的代码范围,另一种方式就是在synchronized关键
				// 字管辖的代码内部调用监视器对象的wait方法。这里,使用wait方法释放锁。
				MutiThread.class.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			System.out.println("结束MyThread1...");
		}

	}

}
public class MyThread2 implements Runnable {

	public void run() {
		synchronized (MutiThread.class) {
			System.out.println("进入MyThread2...");
			System.out.println("MyThread2 通知别的线程可以释放wait状态");
			// 由于notify方法并不释放锁,即使MyThread2调用下面的sleep方法休息了10毫秒,
			//但MyThread1仍然不会执行,因为MyThread2没有释放锁,所以MyThread1无法得不到锁。
			MutiThread.class.notify();
			
			System.out.println("MyThread2 睡眠10秒");
			 try {
                 for(int i=1;i<=10;i++){
                	 System.out.println("睡觉"+i+"秒");
                	 Thread.sleep(1000);
                 }
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             System.out.println("结束MyThread2");
		}

	}

}
public class MutiThread {

	public static void main(String[] args) {
		new Thread(new MyThread1()).start();
		new Thread(new MyThread2()).start();

	}

}

运行结果:

进入MyThread1...
MyThread1 is waiting...
进入MyThread2...
MyThread2 通知别的线程可以释放wait状态
MyThread2 睡眠10秒
睡觉1秒
睡觉2秒
睡觉3秒
睡觉4秒
睡觉5秒
睡觉6秒
睡觉7秒
睡觉8秒
睡觉9秒
睡觉10秒
结束MyThread2
结束MyThread1...

相关文章
|
2月前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
70 9
|
4月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
127 8
|
3月前
|
Java 调度
|
4月前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
114 9
|
4月前
|
Java
JAVA多线程通信:为何wait()与notify()如此重要?
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是实现线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件满足时被唤醒,从而确保数据一致性和同步。相比其他通信方式,如忙等待,这些方法更高效灵活。 示例代码展示了如何在生产者-消费者模型中使用这些方法实现线程间的协调和同步。
58 3
|
5月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
48 1
|
5月前
|
Java
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅
在Java多线程编程中,`wait()`和`notify()`方法的相遇如同一场奇妙的邂逅。它们用于线程间通信,使线程能够协作完成任务。通过这些方法,生产者和消费者线程可以高效地管理共享资源,确保程序的有序运行。正确使用这些方法需要遵循同步规则,避免虚假唤醒等问题。示例代码展示了如何在生产者-消费者模型中使用`wait()`和`notify()`。
52 1
|
5月前
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
98 1
|
7月前
|
Java
Java 中 sleep 和 wait 之间的区别?
【8月更文挑战第21天】
604 0
|
10月前
|
Java 调度
Java中sleep()和wait()方法的区别
【2月更文挑战第10天】
205 1
Java中sleep()和wait()方法的区别
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等