有50个人,60个苹果,怎么用线程池让前50个人拿到苹果后10个拿不到
时间: 2024-09-30 22:08:15 浏览: 16
这是一个关于并发处理的问题,可以利用Java的线程池以及信号量(Semaphore)来实现这个场景。首先,我们需要创建一个固定大小的线程池,比如`ThreadPoolExecutor`,其核心数设置为50。然后,我们可以创建一个信号量`Semaphore`,初始值为60。
```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
public class AppleDistributor {
private final ExecutorService executor = Executors.newFixedThreadPool(50);
private final Semaphore apples = new Semaphore(60);
public void distributeApples() {
for (int i = 0; i < 50; i++) {
executor.submit(() -> {
try {
// 尝试获取苹果
apples.acquire();
System.out.println(Thread.currentThread().getName() + "拿到了一个苹果");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} finally {
// 拿到苹果后放回信号量
apples.release();
}
});
}
// 等待所有线程完成
executor.shutdown();
while (!executor.isTerminated()) {
// 如果还有剩余苹果,允许额外10人尝试获取
if (apples.availablePermits() > 0 && apples.availablePermits() <= 10) {
for (int j = 0; j < Math.min(apples.availablePermits(), 10); j++) {
executor.submit(() -> {
try {
apples.acquire();
System.out.println("第" + (50 + j) + "个人意外地拿到了一个苹果(已满员)");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
} finally {
apples.release();
}
});
}
}
}
}
}
```
在这个例子中,前50个人会成功拿到苹果,因为线程池的大小限制了同时活跃的线程数。当所有苹果都被拿完,如果有额外的空闲线程(即剩下的10个),它们将无法获得苹果,因为信号量已经变为零。
阅读全文