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