用Java代码模拟实现:一个人不断往箱子里放苹果,另一个人不断从箱子里取苹果,箱子里只能放5个苹
发布网友
发布时间:2022-04-24 13:36
我来回答
共3个回答
热心网友
时间:2023-10-14 16:48
package com.zt.test;
import java.util.Stack;
public class Test7 {
private Stack<String> box;
public String operationBox(boolean flag, String num) {
String str = "";
synchronized (Test7.class) {
if (flag) {
this.box.push(num);
} else {
str = this.box.pop();
}
}
return str;
}
public static void main(String args[]) {
Test7 a = new Test7();
a.initApples();
}
public Test7() {
this.box = new Stack<String>();
}
public void forSleep(int i) {
try {
Thread.sleep(i);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 放苹果的人
*/
public void putApple() {
int no = 1;
while (true) {
this.forSleep(1000);
int check = this.box.size();
System.out.println("---------现在有" + check + "个苹果---------");
if (check >= 5) {
System.out.println("------------箱子里有5个苹果无法放入------------");
continue;
} else {
System.out
.println("------------放入第" + no + "个苹果--------------");
this.operationBox(true, no + "");
no = no + 1;
}
}
}
/**
* 拿苹果的人
*/
public void getApple() {
while (true) {
this.forSleep(800);
int check = this.box.size();
System.out.println("=========现在有" + check + "个苹果============");
if (check == 0) {
System.out.println("==========箱子里有0个苹果无法去除===========");
continue;
} else {
String str = this.operationBox(false, null);
System.out.println("==========从箱子出取出第" + str + "个苹果==========");
}
}
}
/*
* 初始化两个人
*/
public void initApples() {
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
putApple();
} catch (Exception e) {
}
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
getApple();
} catch (Exception e) {
}
}
});
t2.start();
}
}
一个放一个拿,operationBox()锁住stack的操作,forsleep方法是进行休眠的,模拟一块一慢,如果需要无序时间,自己写随机函数进行线程休眠。
热心网友
时间:2023-10-14 16:49
开两个线程,对箱子里的苹果数量加锁,单次只允许一个线程访问(+1或-1)
热心网友
时间:2023-10-14 16:49
这是一个经典的生产者与消费者问题,具体实现请参见附件。
自己把Info类修改为Apple,InfoPool改为ApplePool,Procer改为AppleSetter,Consumer改为AppleGetter,这样比较贴近你的要求。
注意例子中实现了单一生产者与单一消费者、单一生产者与多个消费者、单多个生产者与多个消费者三种代码,如果不需要其他的,请自行删除。