java使用wait()和notify()线程间通讯的实现
线程.wait()
当一个线程调用 线程.wait()
时,它会释放对象的锁,让其他线程可以获得这个锁并执行相应的同步代码块,同时,如果未配置超时时间,该线程会无限期等待,直到接收到线程.notify()
信号,注意,一般情况下要在同步代码块中执行。
线程.notify()
当一个线程调用 线程.notify()
时,它会给线程发送一个信号,让其在线程.notify()
卡住的地方继续执行,注意,一般情况下要在同步代码块中执行。
示例
下面是一个演示线程间通讯的示例,在一个定时任务中达成某个条件时,通知主线程继续执行,同时关闭该定时任务:
public static void main(String[] args) throws InterruptedException { final Thread main = Thread.currentThread(); main.setName("main thread"); // 创建一个默认定时任务 ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 5, // 核心线程数 new ThreadPoolExecutor.CallerRunsPolicy() // 队列满后的拒绝策略 ); AtomicInteger flag = new AtomicInteger(0); // 执行定时任务 final ScheduledFuture<?> queryTask = executor.scheduleAtFixedRate(() -> { // 在这里执行您的定时任务逻辑 final int i = flag.addAndGet(1); log.info("定时任务执行了1!flag={}", i); if (i == 5) { synchronized (main) { System.out.println("通知主线程取消该任务"); main.notify(); } } }, 0, 3, TimeUnit.SECONDS); final ScheduledFuture<?> printTask = executor.scheduleAtFixedRate(() -> { // 在这里执行您的定时任务逻辑 log.info("定时任务执行了2!"); }, 0, 3, TimeUnit.SECONDS); log.info("main wait"); synchronized (main) { /** * 主线程在执行 main.wait() 进入等待状态后,确实会释放 main 对象的锁,而不是一直占用锁。 这是 Java 中 wait() 方法的特性之一。 当一个线程调用 wait() 方法时,它会释放对象的锁,让其他线程可以获得这个锁并执行相应的同步代码块。 */ main.wait(); } log.info("main 活了"); // 取消定时任务 queryTask.cancel(true); log.info("scheduledFuture被取消"); }
运行结果:
11:14:50.838 [main thread] INFO MyTaskConfig - main wait
11:14:50.838 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了2!
11:14:50.838 [pool-1-thread-1] INFO MyTaskConfig - 定时任务执行了1!flag=1
11:14:53.845 [pool-1-thread-1] INFO MyTaskConfig - 定时任务执行了2!
11:14:53.845 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了1!flag=2
11:14:56.841 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了1!flag=3
11:14:56.842 [pool-1-thread-3] INFO MyTaskConfig - 定时任务执行了2!
11:14:59.841 [pool-1-thread-4] INFO MyTaskConfig - 定时任务执行了1!flag=4
11:14:59.841 [pool-1-thread-1] INFO MyTaskConfig - 定时任务执行了2!
11:15:02.848 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了2!
11:15:02.848 [pool-1-thread-4] INFO MyTaskConfig - 定时任务执行了1!flag=5
通知主线程取消该任务
11:15:02.848 [main thread] INFO MyTaskConfig - main 活了
11:15:02.848 [main thread] INFO MyTaskConfig - scheduledFuture被取消
11:15:05.835 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了2!
11:15:08.843 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了2!
11:15:11.836 [pool-1-thread-2] INFO MyTaskConfig - 定时任务执行了2!
到此这篇关于java使用wait()和notify()线程间通讯的实现的文章就介绍到这了,更多相关java wait()和notify()线程间通讯内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
序列化版本号serialVersionUID的作用_动力节点Java学院整理
Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象,这篇文章主要介绍了序列化版本号serialVersionUID的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-05-05SpringCloud Feign多参数传递及需要注意的问题
这篇文章主要介绍了SpringCloud Feign多参数传递及需要注意的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03Java的非阻塞队列ConcurrentLinkedQueue解读
这篇文章主要介绍了Java的非阻塞队列ConcurrentLinkedQueue解读,在并发编程中,有时候需要使用线程安全的队列,如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法,需要的朋友可以参考下2023-12-12
最新评论