博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java语言实现操作系统经典同步问题之吸烟者问题
阅读量:3898 次
发布时间:2019-05-23

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

百度全是伪代码,自己做的时候遇到了很多问题,倒腾了几个小时勉强实现了

贴一下代码吧,就是一个4线程并发的小程序

问题描述:

三个吸烟者在一个房间内,还有一个香烟供应者。为了制造并抽掉香烟,每个吸烟者需要三样东西:烟草、纸和火柴,供应 者有丰富货物提供。三个吸烟者中,第一个有自己的烟草,第二个有自己的纸,第三个有自己的火柴。供应者随机地将两样东西放在桌子上,允许一个吸烟者进行对健康不利的吸烟。当吸烟者完成吸烟后唤醒供应者,供应者再把两样东西放在桌子上,唤醒另一个吸烟者。
下面是代码:

桌子类(资源类):

public class Table {
private boolean end=true;//吸烟是否结束 private boolean offer1=false;//吸烟者1是否可以吸烟 private boolean offer2=false;//吸烟者2是否可以吸烟 private boolean offer3=false;//吸烟者3是否可以吸烟 public boolean isEnd() {
return end; } public void setEnd(boolean end) {
this.end = end; } public boolean isOffer1() {
return offer1; } public void setOffer1(boolean offer1) {
this.offer1 = offer1; } public boolean isOffer2() {
return offer2; } public void setOffer2(boolean offer2) {
this.offer2 = offer2; } public boolean isOffer3() {
return offer3; } public void setOffer3(boolean offer3) {
this.offer3 = offer3; } public synchronized void provide(){
int random= (int) (Math.random()*3); if(random==0){
System.out.println("1是否可以开始吸烟:"+offer1); offer1=true; System.out.println("提供了烟草和纸"); }else if(random==1){
System.out.println("2是否可以开始吸烟:"+offer1); offer2=true; System.out.println("提供了纸和胶水"); }else {
System.out.println("3是否可以开始吸烟:"+offer1); offer3=true; System.out.println("提供了胶水和烟草"); } } public synchronized void end(){
if(offer1){
offer1=false;//吸烟者不能连续多次吸烟 System.out.println("吸烟者1吸烟结束"); System.out.println("---------------------"); setEnd(true);//吸烟结束 可以开始下一次随机分配资源 } if(offer2){
offer2=false; System.out.println("吸烟者2吸烟结束"); System.out.println("---------------------"); setEnd(true); } if(offer3){
offer3=false; System.out.println("吸烟者3吸烟结束"); System.out.println("---------------------"); setEnd(true); } }}

提供资源者类:

public class Provider extends Thread{
private Table table; public Provider(Table table){
this.table=table; } int count=0; @Override public void run() {
while (true){
while (table.isEnd()) {
table.provide(); table.setEnd(false);//提供资源后吸烟将开始,设为false } } }}

吸烟者类,由于3个是一样的,这里只贴出一个:

public class SmokerOne extends Thread{
private Table table; public SmokerOne(Table table){
this.table=table; } @Override public void run() {
while (true) {
//System.out.println("吸烟者1请求资源"); if (table.isOffer1()) {
smoke();//吸烟 table.end();//吸烟结束 end方法中设标志位true } } } private void smoke(){
System.out.println("吸烟者1得到了烟草和纸,吸烟"); }}

测试类:

public class Test {
public static void main(String[] args) {
Table table=new Table(); Provider provider=new Provider(table); SmokerOne s1=new SmokerOne(table); SmokerTwo s2=new SmokerTwo(table); SmokerThree s3=new SmokerThree(table); provider.start(); s1.start(); s2.start(); s3.start(); }}

运行结果:

2是否可以开始吸烟:false提供了纸和胶水吸烟者2得到了纸和胶水,吸烟吸烟者2吸烟结束---------------------2是否可以开始吸烟:false提供了纸和胶水吸烟者2得到了纸和胶水,吸烟吸烟者2吸烟结束---------------------3是否可以开始吸烟:false提供了胶水和烟草吸烟者3得到了胶水和烟草,吸烟吸烟者3吸烟结束---------------------1是否可以开始吸烟:false提供了烟草和纸吸烟者1得到了烟草和纸,吸烟吸烟者1吸烟结束---------------------2是否可以开始吸烟:false提供了纸和胶水吸烟者2得到了纸和胶水,吸烟吸烟者2吸烟结束---------------------1是否可以开始吸烟:false提供了烟草和纸吸烟者1得到了烟草和纸,吸烟吸烟者1吸烟结束---------------------1是否可以开始吸烟:false提供了烟草和纸吸烟者1得到了烟草和纸,吸烟吸烟者1吸烟结束

转载地址:http://khyen.baihongyu.com/

你可能感兴趣的文章
visio画图-----如何克服两箭头交叉变形 及 箭头自动重绘?
查看>>
Android开发:安装NDK,移植OpenCV2.3.1,JNI调用OpenCV全过程
查看>>
“金9银10”2020年JVM高频率面试题整理,技术提升就差一个点!
查看>>
简简单单的分享2020常见的MySQL面试题MySQL与答案整理
查看>>
听说只有大厂的Android工程师才能全答对这20道题?我看你在吹牛哦!
查看>>
武功秘籍之 Redis 面试题全掌握,学完马上找面试官对线!
查看>>
50道!2020年!!MySQL高频数据库面试题解析,你都懂了吗?
查看>>
如何用Spring Boot加密配置文件中的特殊内容示例代码详解
查看>>
谈谈这些年面试官给大伙下的那些套,如何解?(面试技巧)
查看>>
5年开发经验的我被几条朋友圈打击到,点燃自己冲击阿里面经!
查看>>
5年工作经验的我放弃安逸,一份来自腾讯魔鬼面试的终极考验!
查看>>
学JAVA吗同学,这篇Sping boot 确定不了解下么?
查看>>
(3年+offer)华为技术岗面试初面+综合面试经验总结
查看>>
男默女泪,努力复习的我终于通过社招进入BAT工作了!(JAVA+JVM+框架+中间件+Spring干货分享)
查看>>
Python 导包
查看>>
dok_matrix
查看>>
theano 后端爆内存
查看>>
os.environ 和 keras.json
查看>>
后台面试经典问题-手写LRU算法
查看>>
Part-Guided Attention Learning for Vehicle Instance Retrieval
查看>>