Java多线程实现苹果橘子问题
时间: 2023-08-05 08:19:52 浏览: 145
苹果橘子问题是一个经典的多线程同步问题,假设有一个篮子,里面装有若干个苹果和橘子,现在有两个人要从篮子里取出水果,一个人只能拿苹果,另一个人只能拿橘子,直到篮子里的水果被取完为止。
Java中可以使用wait()和notify()方法来实现多线程同步,具体实现如下:
```
public class Basket {
private int appleCount; // 苹果数量
private int orangeCount; // 橘子数量
public synchronized void getApple() {
while (appleCount == 0) {
try {
wait(); // 等待苹果
} catch (InterruptedException e) {
e.printStackTrace();
}
}
appleCount--;
System.out.println("取出一个苹果,还剩" + appleCount + "个苹果");
notifyAll(); // 唤醒其他线程
}
public synchronized void getOrange() {
while (orangeCount == 0) {
try {
wait(); // 等待橘子
} catch (InterruptedException e) {
e.printStackTrace();
}
}
orangeCount--;
System.out.println("取出一个橘子,还剩" + orangeCount + "个橘子");
notifyAll(); // 唤醒其他线程
}
public synchronized void put(String fruit, int count) {
if ("apple".equals(fruit)) {
appleCount += count;
System.out.println("放入" + count + "个苹果,还剩" + appleCount + "个苹果");
} else if ("orange".equals(fruit)) {
orangeCount += count;
System.out.println("放入" + count + "个橘子,还剩" + orangeCount + "个橘子");
}
notifyAll(); // 唤醒其他线程
}
}
public class AppleThread extends Thread {
private Basket basket;
public AppleThread(Basket basket) {
this.basket = basket;
}
@Override
public void run() {
while (true) {
basket.getApple();
}
}
}
public class OrangeThread extends Thread {
private Basket basket;
public OrangeThread(Basket basket) {
this.basket = basket;
}
@Override
public void run() {
while (true) {
basket.getOrange();
}
}
}
public class Main {
public static void main(String[] args) {
Basket basket = new Basket();
new AppleThread(basket).start();
new OrangeThread(basket).start();
for (int i = 0; i < 10; i++) {
basket.put("apple", 1);
basket.put("orange", 1);
}
}
}
```
在上面的代码中,Basket类是共享资源,getApple()和getOrange()方法是消费者线程,put()方法是生产者线程。当苹果或橘子被取走后,消费者线程会调用notifyAll()方法来唤醒其他线程,生产者线程在放入水果时也会调用notifyAll()方法来唤醒其他线程。通过wait()和notify()方法的配合,可以实现多线程同步,保证线程安全。
阅读全文