测试小站: 处理网 回收帮 培训网 富贵论坛 老富贵论坛

Java语言实现操作系统,经典同步问题,吸烟者问题

  问题描述:

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

  下面是代码

  桌子类(资源类):

  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()) {

  tablevide();

  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吸烟结束

posted @ 2022-01-14 17:06  linjingyg  阅读(140)  评论(0)    收藏  举报