当前位置: 首页 > 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.jsqmd.com/news/26058/

相关文章:

  • 题解:CF715E Complete the Permutations
  • 日总结 20
  • 重组蛋白与传统蛋白的区别:从来源到特性的全面解析
  • 交个朋友电商学苑直播运营集训班4.0第三天笔记
  • 网球馆自动预约框架的反调试
  • 吃薯片2025有机 - Gon
  • [TOOL] 个人必备工具
  • JTCatch 缓存部署与使用
  • CSP-S 2025 游记
  • arm.dll armaccess.dll arkut.dll arkdd32.dll arizonadll.dll aritmoperacedll.dll ariesengine.dll - 实践
  • 顺利通过试用期:避开三大陷阱,掌握三个关键点
  • UOS镜像下载
  • NordicNRF91系列蜂窝产品在偏远地区低轨道卫星物联网连接领域取得关键突破
  • 深入解析:Inception V3--J9
  • ODT 学习笔记
  • Aout Me!
  • gccgo如何实现golang运行时向特定interface的动态conversion(及和C++虚函数表的对比)
  • 技术人的公关利器:专业新闻稿撰写AI指令深度解析
  • 2025年最新考勤门禁系统推荐与选型攻略
  • 2026 NOI 做题记录(八)
  • elk架构安装部署
  • 冒泡排序 试做版 2025/10/29 21:13
  • CSP 45^2复赛游记
  • 工厂用什么考勤系统好?2025最新8款推荐
  • 深度技术解析低功耗蓝牙厂商nordic的nRF Connect SDK裸机选项方案
  • 20232317 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • 用 Gemini + VS Code 打造属于你的 AI 编程神器(完胜 Cursor!)
  • 《程序员修炼之道:从小工到专家》观后感第三篇
  • profile 与 profile.d 在 Linux 发行版本中的作用 - ENGINEER
  • 思维day1