当前位置: 首页 > news >正文

Day26-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Threadcase

等待唤醒机制

生产者和消费者

image-20251028182301622

image-20251028182448488

package Basic.src.com.Threadcase.Threadwaitnotify;public class Desk {/** 控制生产者和消费者的执行* *///桌子上是否有面条  0;没有面条  1:有面条public static int foodFlag = 0;//总个数public static int count = 10;//锁对象public static Object lock = new Object();}
package Basic.src.com.Threadcase.Threadwaitnotify;public class Cook extends Thread {/*** 需求:完成生产者和消费者(等待唤醒机制)的代码*               实现线程轮流交替执行的结果** *///1.循环//2.同步代码块(同步方法)//3.判断共享数据是否到了末尾,如果到了末尾//4.判断共享数据是否到了末尾,如果没有到末尾@Overridepublic void run() {while(true){synchronized (Desk.lock){if (Desk.count == 0){break;}else {//判断桌子上是否有食物if (Desk.foodFlag ==1 ){//如果有就等待try {Desk.lock.wait();//让当前线程与锁绑定} catch (InterruptedException e) {e.printStackTrace();}}//如果没有,就制作食物else{System.out.println("厨师做了一碗面条");//修改桌子上的食物状态Desk.foodFlag = 1;//叫醒等待的消费者开吃Desk.lock.notifyAll();}}}}}
}
package Basic.src.com.Threadcase.Threadwaitnotify;import static Basic.src.com.Threadcase.Threadwaitnotify.Desk.count;public class Foodie extends Thread {@Overridepublic void run() {/** 1.循环* 2.同步代码块* 3.判断共享数据是否到达末尾(到了末尾)* 4.判断共享数据是否到达末尾(没有到达末尾,执行核心逻辑)* */while (true) {synchronized (Desk.lock) {if (Desk.count ==0){break;} else {//先判断桌子上有面条if (Desk.foodFlag==0){//如果没有就等待try {Desk.lock.wait();//让当前线程与锁绑定} catch (InterruptedException e) {throw new RuntimeException(e);}}if(Desk.foodFlag==1){//把吃的总数-1Desk.count--;//如果有,就开吃System.out.println("吃货正在吃面条,还能再吃"+ count+"碗!");//吃完之后,唤醒厨师继续做Desk.lock.notifyAll();//唤醒绑定在这把锁上的所有线程//修改桌子的状态Desk.foodFlag = 0;}}}}}
}
package Basic.src.com.Threadcase.Threadwaitnotify;public class ThreadDemo {public static void main(String[] args) throws InterruptedException {Cook c = new Cook();Foodie f = new Foodie();//给线程设置名字c.setName("厨师");f.setName("吃货");//开启线程c.start();f.start();}
}

阻塞队列

image-20251029132840931

package Basic.src.com.Threadcase.Threadwaitnotify.ThreadwaitnotifyBlock;import java.util.concurrent.ArrayBlockingQueue;public class Cook extends Thread {ArrayBlockingQueue<String> queue;public Cook(ArrayBlockingQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {while (true) {try {queue.put("面条");//put自带锁System.out.println("厨师放了一碗面条");//锁外} catch (InterruptedException e) {e.printStackTrace();}}}
}
package Basic.src.com.Threadcase.Threadwaitnotify.ThreadwaitnotifyBlock;import java.util.concurrent.ArrayBlockingQueue;public class Foodie extends Thread {ArrayBlockingQueue<String> queue;public Foodie(ArrayBlockingQueue<String> queue) {this.queue = queue;}@Overridepublic void run() {while (true) {try {queue.take();//take()应该为无参,自带锁System.out.println("吃货吃了一碗面条");//锁外} catch (InterruptedException e) {e.printStackTrace();}}}
}
package Basic.src.com.Threadcase.Threadwaitnotify.ThreadwaitnotifyBlock;import java.util.concurrent.ArrayBlockingQueue;public class ThreadDemo {public static void main(String[] args) {/*** 需求:利用阻塞队列完成生产者和消费者(等待唤醒机制)的代码* 细节:*           生产者和消费者必须使用同一个阻塞队列** *///1.创建阻塞队列的对象ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(1);//有界的//2.创建线程的对象,并把阻塞队列传递过去Cook c = new Cook(queue);Foodie f = new Foodie(queue);//3.开启线程c.start();f.start();}
}

image-20251029132949251

八股里面是五个:新建、就绪、运行、死亡、等待

线程池

image-20251029214902694

image-20251029214913523

package Basic.src.com.Threadcase.ThreadPool;public class MyRunnable implements Runnable {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+"-------------"+i);}}
}
package Basic.src.com.Threadcase.ThreadPool;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyThreadPoolDemo {public static void main(String[] args) throws InterruptedException {//1.获取线程池对象//ExecutorService pool1 = Executors.newCachedThreadPool();ExecutorService pool1 = Executors.newFixedThreadPool(3);//2.提交任务pool1.submit(new MyRunnable());//Thread.sleep(1000);pool1.submit(new MyRunnable());//Thread.sleep(1000);pool1.submit(new MyRunnable());//Thread.sleep(1000);pool1.submit(new MyRunnable());//3.销毁线程池//销毁线程池后,里面所有的线程也会消失//pool1.shutdown();}
}
http://www.gsyq.cn/news/34340.html

相关文章:

  • 题解:CF715E Complete the Permutations
  • 网球馆自动预约框架的反调试
  • 吃薯片2025有机 - Gon
  • UOS镜像下载
  • ODT 学习笔记
  • 解题报告-游戏(game.*)
  • 技术人的公关利器:专业新闻稿撰写AI指令深度解析
  • 2025年最新考勤门禁系统推荐与选型攻略
  • CSP 45^2复赛游记
  • 深度技术解析低功耗蓝牙厂商nordic的nRF Connect SDK裸机选项方案
  • 用 Gemini + VS Code 打造属于你的 AI 编程神器(完胜 Cursor!)
  • Nordic NRF54第四代蓝牙产品最优赋能---三星SmartThings Find设备追踪服务
  • 《程序员修炼之道:从小工到专家》前五分之三观后感
  • CAN通讯协议
  • 2025-10-29 早报新闻
  • 关于 google 登陆的一些奇妙技巧
  • 移位寄存器 蓝色 与 粉红色 有什么区别
  • CF1196F K-th Path
  • DicomObjects .NET 8.48.231.0 - 实践
  • 2025.10.29__jyu每日一题题解
  • 线段树入门 - idle
  • vs2022(2026)离线安装失败的问题解决
  • 2025年10月临江鳝丝店推荐榜:五家口碑店铺深度对比与选择指南
  • 2025年10月临江鳝丝店评价榜:传统与创新菜系全面解析
  • 25岁零基础转行软件测试挑战高薪,真的可以么?
  • 提高组模拟赛 40 A. 子序列 题解
  • 详细介绍:Hadoop
  • ARC183 做题记
  • 《强化学习数学原理》学习笔记7——从贝尔曼最优方程得到最优策略 - 教程
  • 白忙活这么多年!早知道有这9款软件,我少熬好几个通宵!