package org.rui.thread.block;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class NotifyVsNotifyAll { public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.execute(new Task()); } exec.execute(new Task2()); Timer timer = new Timer(); // 安排指定的任务在指定的延迟后開始进行反复的固定速率运行。 timer.scheduleAtFixedRate(new TimerTask() { boolean prod = true; public void run() { if (prod) { System.out.println("\n notify() "); Task.blocker.prod();// prod = false; } else { System.out.println("\n notifyAll()"); Task.blocker.prodAll(); prod = true; } } }, 400, 400); TimeUnit.SECONDS.sleep(5);// run for a while... timer.cancel();// 终止此计时器, System.out.println("\n Timer canceled"); TimeUnit.MILLISECONDS.sleep(500); System.out.println("Task.blocker.prodAll()"); Task2.blocker.prodAll();//唤醒task2 不包含不论什么在Task.blocker中的锁上等待的任务 TimeUnit.MILLISECONDS.sleep(500); System.out.println("\nshutting down"); exec.shutdownNow(); }}class Blocker { synchronized void waitingCall() { try { while (!Thread.interrupted()) { wait(); System.out.println(Thread.currentThread() + " "); } } catch (InterruptedException e) { // ok to exit this way } } synchronized void prod() { notify();//在众多等候同一个锁的任务中。仅仅有一个会被唤醒,因此假设你希望使用nofify ,就必须保证被唤醒的是恰当的任务 } synchronized void prodAll() { notifyAll();//仅仅有等待这个锁的任务才会被唤醒 }}// class Task implements Runnable { static Blocker blocker = new Blocker(); public void run() { blocker.waitingCall(); }}// class Task2 implements Runnable { // a separate blocker object 一个单独的拦截器对象 static Blocker blocker = new Blocker(); public void run() { blocker.waitingCall(); //System.out.println(Thread.currentThread()+" : Task 不会被换醒Task2"); }}/** * output: * notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-5,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-1,5,main] notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-1,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-5,5,main] notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-5,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-1,5,main] notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-1,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-5,5,main] notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-5,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-1,5,main] notify() Thread[pool-1-thread-2,5,main] notifyAll()Thread[pool-1-thread-2,5,main] Thread[pool-1-thread-1,5,main] Thread[pool-1-thread-3,5,main] Thread[pool-1-thread-4,5,main] Thread[pool-1-thread-5,5,main] Timer canceledTask.blocker.prodAll()Thread[pool-1-thread-6,5,main] shutting down*/
java 线程 错失的信号、notify() 与notifyAll的使用
发布日期:2021-06-24 18:10:58
浏览次数:3
分类:技术文章
本文共 3271 字,大约阅读时间需要 10 分钟。
转载地址:https://blog.csdn.net/weixin_34248258/article/details/85894218 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年03月29日 23时09分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android软键盘(1)---输入法界面管理(打开/关闭/状态获取)
2021-06-30
Android动态设置view的高度宽度
2021-06-30
vue 事件总线EventBus的概念、使用以及注意点
2021-06-30
JavaScript 用七种方式教你判断一个变量是否为数组类型
2021-06-30
黄家懿:河北高校邀请赛 -- 二手车交易价格预测决赛答辩
2021-06-30
如何利用pyecharts绘制酷炫的桑基图?
2021-06-30
王朝阳:河北高校邀请赛 -- 二手车交易价格预测决赛答辩
2021-06-30
Scratch等级考试(二级)模拟题
2021-06-30
如何在Jupyter Lab中显示pyecharts的图形?
2021-06-30
什么是Python之禅?
2021-06-30
【青少年编程】【Scratch】01 运动模块
2021-06-30
json的序列化与反序列化
2021-06-30
【第16周复盘】学习的飞轮
2021-06-30
如何利用pyecharts绘制炫酷的关系网络图?
2021-06-30
NCEPU:线下组队学习周报(007)
2021-06-30
【青少年编程】【二级】寻找宝石
2021-06-30
LeetCode-LCP 18. 早餐组合(Goland实现)
2021-06-30
C++从入门到进阶近100本书推荐电子书pdf
2021-07-01
蓝桥杯 - [2014年第五届真题]分糖果(模拟)
2021-07-01