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实现HTML转为Word的示例代码 2023-02-04
- Go Java算法重复的DNA序列详解 2023-04-12
- oracle: jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 无效的列类型: 1111 2023-10-31
- Eureka源码阅读解析Server服务端启动流程实例 2023-06-16
- 小项目改造快速引入 mybatis的流程分析 2022-11-23
- MyBatis-Plus自定义通用的方法实现 2023-07-15
- java日期格式化YYYY-MM-dd遇坑指南小结 2023-04-17
- Maven Pom 文件中的隐式依赖导致Jar冲突问题 2023-08-10
- RocketMQ NameServer 核心源码解析 2023-05-19
- springboot整合mybatis plus与druid详情 2023-06-01
