百度全是伪代码,自己做的时候遇到了很多问题,倒腾了几个小时勉强实现了
贴一下代码吧,就是一个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吸烟结束