黑马程序员技术交流社区

标题: 求解这道多线程题 [打印本页]

作者: veritas.lyj    时间: 2016-11-3 17:34
标题: 求解这道多线程题
定义一个数组 { "橘子", "桃子", "李子", "榴莲", "香蕉", "樱桃" }
        * 分三条线程abc去随机抢水果;抢到的水果不能重复
        * 抢完水果后打印谁抢了多少个
        *  A抢到李子
                A抢到榴莲
                B抢到香蕉
                C抢到樱桃
                B抢到橘子
                A抢到桃子
                A抢了3个
                B抢了2个
                C抢了1个*/
作者: GXM    时间: 2016-11-3 17:53
在run()方法中遍历数组,输出打印语句,在主方法中创建三条线程,即可

作者: 回根的落叶    时间: 2016-11-3 18:43
[Java] 纯文本查看 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Test01 {

        /**
         * 定义一个数组 { "橘子", "桃子", "李子", "榴莲", "香蕉", "樱桃" }
        * 分三条线程abc去随机抢水果;抢到的水果不能重复
        * 抢完水果后打印谁抢了多少个
         * @param args
         */
        public static void main(String[] args) {
                String[] arr = {"橘子", "桃", "李子", "榴莲", "香蕉", "樱桃"};
                MyRunnable mr = new MyRunnable(arr);
                Thread t1 = new Thread(mr, "A");
                Thread t2 = new Thread(mr, "B");
                Thread t3 = new Thread(mr, "C");
               
                t1.start();
                t2.start();
                t3.start();
        }
}

class MyRunnable implements Runnable {
        private int count = 0;
        private List<String> list;
        private String[] arr;
        private Random rd;
        private int countA = 0;
        private int countB = 0;
        private boolean flag = true;
        public MyRunnable(String[] arr) {
                super();
                list = new ArrayList<String>();
                for (String string : arr) {
                        list.add(string);
                }
                this.arr = arr;
                rd = new Random();
        }

        @Override
        public void run() {
                while(true){
                        try {
                                Thread.sleep(30);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        synchronized(this) {
                                if (count >= arr.length) {
                                        break;
                                }
                                String name = Thread.currentThread().getName();
                                if ("A".equals(name)) {
                                        countA ++;
                                } else if ("B".equals(name)) {
                                        countB++;
                                }
                                int index = rd.nextInt(list.size());
                                System.out.println(name + "获取到了" + list.get(index));
                                list.remove(index);
                        }
                        count++;
                }
                synchronized (this) {
                        if (flag) {
                                System.out.println("A一共获取到了" + countA + "个");
                                System.out.println("B一共获取到了" + countB + "个");
                                System.out.println("C一共获取到了" + (count-countA-countB) + "个");
                                flag  = false;
                        }
                }
        }
}






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