java现有一百个快递待派发定义快递类Expresses 作为公共资源类定义快递员线程类Mailman 请开启三个线程派发此100个快递并打印哪个快递员派发了哪一个快递。最后打印出每个快递员派发了多少快递
下面是一个实现上述要求的示例代码:
import java.util.concurrent.Semaphore;
class Expresses {
private int[] packages;
private Semaphore semaphore;
public Expresses(int numPackages) {
packages = new int[numPackages];
semaphore = new Semaphore(1);
}
public void assignPackage(int packageIndex, int mailmanId) {
try {
semaphore.acquire();
packages[packageIndex] = mailmanId;
System.out.println("Mailman " + mailmanId + " assigned package " + packageIndex);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
public int getNumPackagesAssignedToMailman(int mailmanId) {
int count = 0;
for (int i = 0; i < packages.length; i++) {
if (packages[i] == mailmanId) {
count++;
}
}
return count;
}
}
class Mailman implements Runnable {
private int mailmanId;
private Expresses expresses;
public Mailman(int mailmanId, Expresses expresses) {
this.mailmanId = mailmanId;
this.expresses = expresses;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
expresses.assignPackage(i, mailmanId);
}
}
}
public class Main {
public static void main(String[] args) {
Expresses expresses = new Expresses(100);
Thread[] threads = new Thread[3];
for (int i = 0; i < 3; i++) {
threads[i] = new Thread(new Mailman(i, expresses));
threads[i].start();
}
for (int i = 0; i < 3; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 3; i++) {
System.out.println("Mailman " + i + " assigned " + expresses.getNumPackagesAssignedToMailman(i) + " packages");
}
}
}
在这个示例中,我们使用了Semaphore来控制对共享资源Expresses的访问。每个快递员线程在派发快递之前需要先获取信号量,以保证只有一个线程可以修改packages数组。在派发快递后,线程释放信号量,允许其他线程进行派发操作。
最后,在主线程中,我们等待所有快递员线程执行完毕后,打印每个快递员派发了多少快递
原文地址: http://www.cveoy.top/t/topic/inMy 著作权归作者所有。请勿转载和采集!