下面是一个实现上述要求的示例代码:

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数组。在派发快递后,线程释放信号量,允许其他线程进行派发操作。

最后,在主线程中,我们等待所有快递员线程执行完毕后,打印每个快递员派发了多少快递

java现有一百个快递待派发定义快递类Expresses 作为公共资源类定义快递员线程类Mailman 请开启三个线程派发此100个快递并打印哪个快递员派发了哪一个快递。最后打印出每个快递员派发了多少快递

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

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