Java代码实现现有200个豆子,请使用线程模拟5个人抢豆子, 名字自定义,每人抢到的豆子请保存在各自的集合中, 保证线程安全。遍历每人保存豆子的集合
时间: 2023-03-02 08:41:29 浏览: 211
Java实现的吃豆子游戏
以下是Java代码实现现有200个豆子,并用线程模拟5个人抢豆子的过程。每个人的名字自定义,每人抢到的豆子都保存在各自的集合中,确保线程安全。最后,代码还会遍历每个人的豆子集合,以显示每个人最终抢到的豆子数量。
```java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private static int beanCount = 200;
private static Lock lock = new ReentrantLock();
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("张三");
names.add("李四");
names.add("王五");
names.add("赵六");
names.add("钱七");
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < names.size(); i++) {
result.add(new ArrayList<>());
}
for (int i = 0; i < beanCount; i++) {
int index = i % names.size();
String name = names.get(index);
new Thread(() -> {
lock.lock();
try {
if (beanCount > 0) {
result.get(index).add(1);
beanCount--;
System.out.println(name + "抢到了1个豆子,还剩" + beanCount + "个豆子。");
}
} finally {
lock.unlock();
}
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i) + "抢到了" + result.get(i).size() + "个豆子。");
}
}
}
```
以上代码中,我们使用了ReentrantLock来确保线程安全。每个线程都会尝试获取锁,以便对共享资源(即豆子数量和每个人的豆子集合)进行修改。当豆子数量为0时,所有线程都会停止执行。最后,我们遍历每个人的豆子集合,以显示每个人最终抢到的豆子数量。
阅读全文