JUC(Java Util Concurrent)是Java中用于处理多线程编程的库,其中包含了大量的线程处理类,其中常用的类之一是Object类中的wait方法和notify方法。本文将详细讲解JUC中的wait与notify方法实现原理。
JUC中的wait与notify方法实现原理详解
JUC(Java Util Concurrent)是Java中用于处理多线程编程的库,其中包含了大量的线程处理类,其中常用的类之一是Object类中的wait方法和notify方法。本文将详细讲解JUC中的wait与notify方法实现原理。
wait方法的实现原理
wait方法是Object类中的一个方法,表示让线程等待,直到其他线程中断或唤醒该线程。其实现原理是让调用wait方法的线程进入等待队列(WaitSet),并且将线程状态设置为等待状态(WAITING或TIMED_WAITING)。等待队列中的线程等待被唤醒,唤醒机制由notify方法实现。
具体实现过程可以分为下面三个步骤:
1.当前线程进入等待队列,释放当前对象的锁(如果有的话)。
2.当有其他线程调用该对象的notify/notifyAll方法并持有了该对象的锁时,等待队列中的线程就会被唤醒,开始竞争锁。
3.当某个线程竞争成功后会从等待队列中移除,继续执行下面的逻辑。
wait方法的使用示例:
public class WaitTest {
public synchronized void waitMethod() {
try {
System.out.println(Thread.currentThread().getName() + " is waiting");
Thread.sleep(1000);
wait(); // 调用wait方法,释放当前对象锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void notifyMethod() {
System.out.println(Thread.currentThread().getName() + "开始通知所有等待的线程");
notifyAll(); // 调用notifyAll方法唤醒等待队列中的所有线程
}
}
public class WaitNotifyDemo {
public static void main(String[] args) {
WaitTest waitTest = new WaitTest();
Runnable waitTask = () -> waitTest.waitMethod();
Runnable notifyTask = () -> waitTest.notifyMethod();
new Thread(waitTask, "线程1").start();
new Thread(waitTask, "线程2").start();
new Thread(notifyTask, "线程3").start();
}
}
notify方法的实现原理
notify方法是Object类中的一个方法,表示唤醒在等待队列中的一个线程,让它可以继续执行,该方法必须在同步方法块或同步方法中使用。其实现原理是通过唤醒等待队列(WaitSet)中的一个线程,该线程从等待队列中移除并重新加入运行队列(RunSet)。
具体实现过程可以分为下面三个步骤:
1.当前线程通知等待队列中的一个线程。
2.通知的线程由等待队列移到运行队列中。
3.线程运行后会经过CPU调度器的调度。
notify方法的使用示例:
public class WaitTest {
public synchronized void waitMethod() {
try {
System.out.println(Thread.currentThread().getName() + " is waiting");
Thread.sleep(1000);
wait(); // 调用wait方法,释放当前对象锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void notifyMethod() {
System.out.println(Thread.currentThread().getName() + "开始通知等待的线程");
notify(); // 调用notify方法唤醒等待队列中的一个线程
}
}
public class WaitNotifyDemo {
public static void main(String[] args) {
WaitTest waitTest = new WaitTest();
Runnable waitTask = () -> waitTest.waitMethod();
Runnable notifyTask = () -> waitTest.notifyMethod();
new Thread(waitTask, "线程1").start();
new Thread(waitTask, "线程2").start();
new Thread(notifyTask, "线程3").start();
}
}
以上就是JUC中wait与notify方法实现原理的详细讲解。通过这篇攻略,您可以更深入地了解JUC中的线程处理机制,以便更好地处理多线程编程。
本文标题为:JUC中的wait与notify方法实现原理详解


- Java中精确的浮点运算操作示例 2024-02-01
- jsp中为表格添加水平滚动条的实现方法 2023-08-02
- springboot中报错Invalid character found in the request的解决 2023-06-06
- MyBatis-Plus中SimpleQuery查询实现 2023-04-07
- SpringBoot集成POI导出Execl表格之统一工具类 2023-05-09
- SpringBoot 中使用JSP的方法示例 2023-12-27
- java设计模式(实战)-责任链模式 2023-08-07
- 关于Java的Character类详解 2023-07-15
- JSP的response对象的实例详解 2023-07-31
- 基于@JsonFormat的导包问题 2024-02-01