网站突然不收录了,深圳龙华区邮政编码多少,办公室装修设计及报价,网站备案时间怎么查询1. 生产者与消费者 实现线程轮流交替执行的结果#xff1b; 实现线程休眠和唤醒均要使用到锁对象#xff1b; 修改标注位#xff08;foodFlag#xff09;#xff1b; 代码实现#xff1a; public class demo11 {public static void main(String[] args) {/*** 需求#…1. 生产者与消费者 实现线程轮流交替执行的结果 实现线程休眠和唤醒均要使用到锁对象 修改标注位foodFlag 代码实现 public class demo11 {public static void main(String[] args) {/*** 需求完成消费者和生产者等待唤醒机制的代码* 实现线程轮流交替执行的结果*/Cooker cooker new Cooker();Foodie foodie new Foodie();cooker.setName(厨师);foodie.setName(吃货);cooker.start();foodie.start();}
}
class Cooker extends Thread {Overridepublic void run() {/*** 1.循环* 2.同步代码快* 3.判断共享数据是否到了末尾到了末尾* 4.判断共享数据是否到了末尾没到末尾执行核心逻辑*/while(true){synchronized (Desk.lock){if(Desk.count 0){break;}else {// 判断桌子上是否有食物if(Desk.foodFlag 1) {// 如果有就等待try {Desk.lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}else {// 如果没有就制作食物System.out.println(厨师在制作面条);// 修改桌子上的食物状态Desk.foodFlag 1;// 叫醒等待的消费者开吃Desk.lock.notifyAll();}}}}}
}
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);}}else {// 把吃的总数-1Desk.count --;// 如果有就开吃System.out.println(吃货在吃面条还能再吃 Desk.count 碗);// 吃完之后就唤醒厨师继续做Desk.lock.notifyAll();// 最后要修改桌子的状态Desk.foodFlag 0;}}}}}
}class Desk extends Thread {/*** 作用控制生产者和消费者的执行*/// 是否有面条 0没有面条 1有面条public static int foodFlag 0;// 总个数public static int count 10;// 锁对象public static Object lock new Object();
}2. 使用阻塞队列实现 阻塞队列当存入数据时如果空间已满就阻塞当取出数据时如果没有数据在队列中就阻塞 public class demo12 {public static void main(String[] args) {/*** 需求利用阻塞队列完成生产者和消费者* 细节* 生产者和消费者必须使用同一个阻塞队列*///1. 创建阻塞队列的对象ArrayBlockingQueueString queue new ArrayBlockingQueueString(1);//2. 创建线程的对象并把阻塞队列传递过去Cook12 cook12 new Cook12(queue);Foodie12 foodie12 new Foodie12(queue);cook12.start();foodie12.start();}
}
class Cook12 extends Thread {//只定义不给值ArrayBlockingQueueString queue;//让构造方法获取public Cook12(ArrayBlockingQueueString queue) {this.queue queue;}Overridepublic void run() {while(true){//不断的把面条放到阻塞队列之中try {//ctrlb进入源码//put底层已经实现了锁所以无需再写锁queue.put(面条);System.out.println(厨师做了面条);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}class Foodie12 extends Thread {ArrayBlockingQueueString queue;//让构造方法获取public Foodie12(ArrayBlockingQueueString queue) {this.queue queue;}Overridepublic void run() {while(true){//不断的从阻塞队列中获取面条try {//ctrlb进入源码//put底层已经实现了锁所以无需再写锁String take queue.take();System.out.println(take);} catch (InterruptedException e) {throw new RuntimeException(e);}}}
}3. 多线程的6种状态