A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

创建一个数组存放6个水果:[“橘子”,”桃”,”李子”,”榴莲”,“香蕉”,”樱桃”];开启三个线程(代表三个人:A、B、C)去抢这6个水果,每抢一个水果需耗时300ms。
要求:每个人随机抢这些水果,在控制台上打印出哪个人抢到了哪个水果,每个人抢了多少个

1 个回复

倒序浏览
package com.heima.test;

import java.util.ArrayList;
import java.util.Random;

/*
注释很详细,看看吧  一看就懂,加油,今天点招面试 现场敲了这种类型的

定义一个数组,里面有六种水果"橘子","桃","李子","榴莲","香蕉","樱桃",
建立三个(名字分别为A、B、C)线程,每隔300ms从数组中取出一种水果,统计每次是谁取到哪种水果
取完后统计每人取了多少个水果 。结果如
*/
public class Test7 {

        public static void main(String[] args) {
                ShuiGuo sg = new ShuiGuo("A");
                ShuiGuo sg1 = new ShuiGuo("B");
                ShuiGuo sg2 = new ShuiGuo("C");
                sg.start();
                sg1.start();
                sg2.start();
        }

}
class ShuiGuo extends Thread {
        //自己给出有参构造,将名字传给父类;
        public ShuiGuo(String name) {
                super(name);
        }
        //三条线程取一种水果,所以静态修饰
        private static String[] arr = {"橘子","桃","李子","榴莲","香蕉","樱桃"};
        //创建随机数对象
        private Random r = new Random();
        //定义静态计数器,不成超过数组索引;
        private static int num;
        //定义每个对象自己的总计数器,属于对象,不用静态修饰
        private int count;
        //创建集合,我的主要目的是为了去重,也可以用其他方法,静态修饰,被所有对象共享
        private static ArrayList<Integer> ar = new ArrayList<>();
        //重写Run方法
        public void run() {
                while(true) {
                        //同步锁
                        synchronized (ShuiGuo.class) {
                                //当拿到比索引还到的值,说明已经拿完了
                                if(num >= arr.length) {
                                        //每个线程到最后一步都会执行到这里,所以,总数直接到这里输出;
                                        System.out.println(this.getName()+"拿到了"+count+"个水果");
                                        break;
                                }
                                try {
                                        //300MS等待时间
                                        Thread.sleep(300);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                int a;
                                while(true) {
                                        //获取随机索引
                                        int b = r.nextInt(arr.length);
                                        //不包含存入集合,跳出循环,取出索引
                                        if(!ar.contains(b)){
                                                ar.add(b);
                                                a = b;
                                                break;
                                        }
                                }
                                //直接打印索引对应的元素
                                System.out.println(this.getName()+"取得了一个"+arr[a]);
                                //每个对象计数器加
                                count++;
                                //索引拿到一个,也加一,不能超过数组长度,前面有定义
                                num++;
                        }       
                }
               
        }
       
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马