现有一百个快递待派发请使用java定义快递类Expresses 作为公共资源类定义快递员线程类Mailman 请开启三个线程派发此100个快递并打印哪个快递员派发了哪一个快递。最后打印出每个快递员派发了多少快递
import java.util.concurrent.Semaphore;
public class Expresses {
private static final int NUM_EXPRESSES = 100;
private static final int NUM_MAILMEN = 3;
private static final Semaphore semaphore = new Semaphore(1);
public static void main(String[] args) {
Expresses expresses = new Expresses();
expresses.startMailmen();
}
public void startMailmen() {
Mailman[] mailmen = new Mailman[NUM_MAILMEN];
for (int i = 0; i < NUM_MAILMEN; i++) {
mailmen[i] = new Mailman("快递员" + (i+1));
mailmen[i].start();
}
for (int i = 0; i < NUM_MAILMEN; i++) {
try {
mailmen[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < NUM_MAILMEN; i++) {
System.out.println(mailmen[i].getName() + "派发了" + mailmen[i].getNumDelivered() + "个快递");
}
}
public static class Mailman extends Thread {
private static int count = 0;
private int numDelivered = 0;
public Mailman(String name) {
super(name);
}
public int getNumDelivered() {
return numDelivered;
}
@Override
public void run() {
while (count < NUM_EXPRESSES) {
try {
semaphore.acquire();
if (count < NUM_EXPRESSES) {
count++;
numDelivered++;
System.out.println(this.getName() + "派发了第" + count + "个快递");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
}
}
}
运行以上代码,将会输出每个快递员派发的快递数量。
示例输出:
快递员1派发了第1个快递
快递员2派发了第2个快递
快递员3派发了第3个快递
快递员3派发了第4个快递
快递员1派发了第5个快递
...
快递员3派发了第98个快递
快递员2派发了第99个快递
快递员1派发了第100个快递
快递员1派发了34个快递
快递员2派发了33个快递
快递员3派发了33个快递
``
原文地址: http://www.cveoy.top/t/topic/iowZ 著作权归作者所有。请勿转载和采集!