黑马程序员技术交流社区

标题: 点找面试的一道多线程编程题,懵逼了,求解 [打印本页]

作者: 小菜白白白    时间: 2016-9-19 20:18
标题: 点找面试的一道多线程编程题,懵逼了,求解
本帖最后由 小菜白白白 于 2016-9-19 20:19 编辑

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

作者: flfjewffg    时间: 2016-9-19 22:42
package com.heima.test;

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

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

*/
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++;
                        }       
                }
               
        }
       
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2