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个快递
``
现有一百个快递待派发请使用java定义快递类Expresses 作为公共资源类定义快递员线程类Mailman 请开启三个线程派发此100个快递并打印哪个快递员派发了哪一个快递。最后打印出每个快递员派发了多少快递

原文地址: http://www.cveoy.top/t/topic/iowZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录