实现案例
有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖
//.....
案例分析:
1.首先创建一个资源类 存储数组和一个布尔值(用来实现轮流打印输出结果)
class Resource2 {
public int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
public boolean flag = true;
}
注意:
这里将flag设置成true的意思是 当flag为true,就执行第一个线程,打印抽奖箱1 又产生了…(当然也可以设置成false 原理一样)
2.创建两个线程类,实现多线程
class Thread1 implements Runnable{
private Resource2 r;
public Thread1(Resource2 r){
this.r = r;
}
@Override
public void run() {
while (true){
synchronized (r){
if(r.flag==false){
try{r.wait();}catch (Exception ex){};
}
Random ran = new Random();
int i = ran.nextInt(r.arr.length);
System.out.println(Thread.currentThread().getName()+"又产生了"+r.arr[i]+"元大奖");
r.flag=false;
r.notify();
}
}
}
}
class Thread2 implements Runnable{
private Resource2 r;
public Thread2(Resource2 r){
this.r = r;
}
@Override
public void run() {
while (true){
synchronized (r){
if(r.flag==true){
try{r.wait();}catch (Exception ex){};
}
Random ran = new Random();
int i = ran.nextInt(r.arr.length);
System.out.println(Thread.currentThread().getName()+"又产生了"+r.arr[i]+"元大奖");
r.flag=true;
r.notify();
}
}
}
}
注意:
这里要想实现数组内值的随机打印,需要先获取数组的长度,然后通过int i = new random().nextInt(arr.length) 随机获取一个数组的下标,然后通过arr[i]获取数组内的值来实现随机打印。(代码可以再次进行提取)
3.调用main方法测试程序是否满足要求
public class Test7 {
public static void main(String[] args) {
// int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
Resource2 r = new Resource2();
Thread1 thread1 = new Thread1(r);
Thread t0 = new Thread(thread1);
t0.setName("抽奖池1");
t0.start();
Thread2 thread2 = new Thread2(r);
Thread t1 = new Thread(thread2);
t1.setName("抽奖池2");
t1.start();
}
}
总结:
要想实现多线程的轮流打印(实现线程之间的通信),就是运用了等待与唤醒机制中的wait()和notify()方法。