CherryOto 2021-02-25 02:00 采纳率: 100%
浏览 169
已结题

关于线程一个小模块中的问题

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

public class Expresses {
    private String name;

    public Expresses() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Expresses(String name) {
        this.name = name;
    }

}
public class Mailman extends Thread{

    private static Expresses[] ex = new Expresses[100];
    static {
        for (int i = 0; i < 100; i++) {
            // 给100个快递赋予 名称
            ex[i] = new Expresses("快递-->"+i);
        }
    }

    private int index;
    private int number;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (Mailman.class) {
                if (index < 100) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //遍历得到对象数组每一个对象
                    Expresses e = ex[index++];
                    // 输入那个线程(快递员)派发了哪一份快递
                    System.out.println(Thread.currentThread().getName()+"派送了"+e.getName()+"快递");
                    number++;
                }
            }
        }
        System.out.println(getName() + "发了" + number+"份快递");
    }

}
    public static void main(String[] args) {
        Mailman m1 = new Mailman();
        m1.start();
        Mailman m2 = new Mailman();
        m2.start();
        Mailman m3 = new Mailman();
        m3.start();

    }
  • 写回答

5条回答 默认 最新

  • hunger_wang 2021-02-25 09:10
    关注

    你这样达不到效果,3个线程会每个都发送100个快递。因为采用成员变量index,3个线程之间没有交互。可以像下面这样(不过同一时刻也只有一个线程发送,吞吐量也比较低,大家都抢Mailman.class这把锁):

        private static class Expresses {
            private String name;
         
            public Expresses() {
            }
         
            public String getName() {
                return name;
            }
         
            public void setName(String name) {
                this.name = name;
            }
         
            public Expresses(String name) {
                this.name = name;
            }
         
        }
        
        private static class Mailman extends Thread{
            
            private static volatile int curr = 0;
            private static Expresses[] ex = new Expresses[100];
            static {
                for (int i = 0; i < 100; i++) {
                    // 给100个快递赋予 名称
                    ex[i] = new Expresses("快递-->"+i);
                }
            }
         
    //        private int index;
            private int number;
         
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    synchronized (Mailman.class) {
                        if (curr < 100) {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            //遍历得到对象数组每一个对象
    //                        Expresses e = ex[index++];
                            Expresses e = ex[curr];
                            // 输入那个线程(快递员)派发了哪一份快递
                            System.out.println(Thread.currentThread().getName()+"派送了"+e.getName()+"快递");
                            number++;
                        }
                        
                        curr++;
                    }
                }
                System.out.println(getName() + "发了" + number+"份快递");
            }
         
        }
        
        public static void main(String[] args) {
            Mailman m1 = new Mailman();
            m1.start();
            Mailman m2 = new Mailman();
            m2.start();
            Mailman m3 = new Mailman();
            m3.start();
        }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月7日
  • 已采纳回答 11月29日

悬赏问题

  • ¥15 对于这个问题的代码运行
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败