博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA多线程信号灯法学习经验
阅读量:5014 次
发布时间:2019-06-12

本文共 3749 字,大约阅读时间需要 12 分钟。

1 package CoTest; 2  3 /** 4  * 信号灯 5  * 借助标志位 6  * @author yuche 7  * 8  */ 9 10 public class CoTest2 {11     public static void main(String[] args) {12         Bread1 bread=new Bread1();13         new Producer1(bread).start();14         new Consumer1(bread).start();15 16     }17 18 }19 20 class Consumer1 extends Thread{21     Bread1 bread;22     23     public Consumer1(Bread1 bread) {24         super();25         this.bread = bread;26     }27 28     @Override29     public void run() {30         for(int i=1;i<100;++i) {31             consume();    32         }33     }34     35     public synchronized void consume(){36             if(bread.flag) {37                 try {38                     this.wait();39                 } catch (InterruptedException e) {40                     e.printStackTrace();41                 }42             }43                     System.out.println("消费");44                     bread.flag=!bread.flag;45                     this.notifyAll();46     }47     48 }49 50 class Producer1 extends Thread{51     Bread1 bread;52     53     public Producer1(Bread1 bread) {54         super();55         this.bread = bread;56     }57 58     @Override59     public void run() {60         for(int i=1;i<100;++i) {61             produce();62         }63 }64     65     public synchronized void produce(){66             if(!bread.flag) {67                 try {68                     this.wait();69                 } catch (InterruptedException e) {70                     e.printStackTrace();71                 }72             }73                     System.out.println("生产");74                     bread.flag=!bread.flag;75                     this.notifyAll();76     }77 }78 79 //资源80 class Bread1{81     //为T表示面包在生产,为F表示可以消费了82     boolean flag;83     public Bread1() {84         flag=true;85     }86 }

运行后,出现一次生产,出现一次消费后就结束了,无法相互唤醒。查找资料后发现我加的锁在2个线程中,没有交点不会相互唤醒。因此把同步方法放入Bread类中可解决,修改后的代码如下

1 package CoTest; 2  3 /** 4  * 信号灯 5  * 借助标志位 6  * @author yuche 7  * 8  */ 9 10 public class CoTest2 {11     public static void main(String[] args) {12         Bread1 bread=new Bread1();13         new Producer1(bread).start();14         new Consumer1(bread).start();15     }16 }17 18 class Consumer1 extends Thread{19     Bread1 bread;20     21     public Consumer1(Bread1 bread) {22         super();23         this.bread = bread;24     }25 26     @Override27     public void run() {28         for(int i=1;i<100;++i) {29             bread.consume();    30         }31     }    32 }33 34 class Producer1 extends Thread{35     Bread1 bread;36     37     public Producer1(Bread1 bread) {38         super();39         this.bread = bread;40     }41 42     @Override43     public void run() {44         for(int i=1;i<100;++i) {45             bread.produce();46         }47     }48 }49 50 //资源51 //同步方法要放在资源里,没有交点不会相互唤醒52 class Bread1{53     //为T表示面包在生产,为F表示可以消费了54     boolean flag;55     public Bread1() {56         flag=true;57     }58     59     public synchronized void produce(){60         if(!this.flag) {61             try {62                 this.wait();63             } catch (InterruptedException e) {64                 e.printStackTrace();65             }66         }67                 System.out.println("生产");68                 this.flag=!this.flag;69                 this.notifyAll();70     }71     72     public synchronized void consume(){73         if(this.flag) {74             try {75                 this.wait();76             } catch (InterruptedException e) {77                 e.printStackTrace();78             }79         }80                 System.out.println("消费");81                 this.flag=!this.flag;82                 this.notifyAll();83     }84 }

 

转载于:https://www.cnblogs.com/yuchengwei/p/11155934.html

你可能感兴趣的文章
跨浏览器问题的五种解决方案
查看>>
ch02 fundamental definition 01
查看>>
Jquery Uploadify3.21.与2.1版本 使用中存在的问题--记录三
查看>>
Linux查看进程的内存占用情况 分类: ubuntu ...
查看>>
[BZOJ 2818]Gcd
查看>>
160. Intersection of Two Linked Lists
查看>>
人生苦短,我用python-- Day11
查看>>
JAVA Bean
查看>>
ehcache memcache redis 三大缓存男高音_转
查看>>
curd_3
查看>>
百度地图API示例之设置地图显示范围
查看>>
Java构造方法、重载及垃圾回收
查看>>
.Net Core AES加密解密
查看>>
Spring Quartz实现任务调度
查看>>
python | 桶排序、冒泡排序、选择排序、去重
查看>>
Mac升级bash到最新版本
查看>>
美女与硬币问题
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>