抽奖箱题谈多线程
题目如下::/*4有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr =
{10,5,20,50,100,200,500,800,2,80,300};
创建两个抽奖箱(线程)设置线程名称分别为“抽奖箱1”,“抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上,格式如下:
抽奖箱1 又产生了一个 10 元大奖
抽奖箱2 又产生了一个 100 元大奖 //…
*/
package t4_prize;
import java.util.Random;
public class t4_prize_test {
public static void main(String[] args) {
WinPrize w=new WinPrize();
Thread w1=new Thread(w,"抽奖箱1");
Thread w2=new Thread(w,"抽奖箱2");
w1.start();
w2.start();
}
}
class WinPrize implements Runnable{
int[] arr = {10,5,20,50,100,200,500,800,2,80,300};
int n=0;
public synchronized void makeprize() {
int length=arr.length-n;
if (length>0) {
Random r=new Random(System.currentTimeMillis());
int i=r.nextInt(length);
System.out.print(Thread.currentThread().getName()+"又产生了一个"+arr[i]+"元大奖");
System.out.println(",共抽奖"+(n+1)+"次");
n++;
arr[i]=arr[length-1];
}
}
@Override
public void run() {
while(n<=arr.length) {
makeprize();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第一:代码的随机数取法:
若 需要取length的随机数,(length指的是数组的长度,其中length=11)则代码为:
Random r=new Random(System.currentTimeMillis());
int i=r.nextInt(length);
System.currentTimeMillis() 获取当前时间,
int i= r.nextInt(length); ----指的是 0-10 ;
若 r.nextInt(10); ---------则指的为0-9 ;
第二:对于数据没有顺序的随机取法,我们将数取出来之后,可将取到的数与最后一个数进行对换,在将数组的长度减一。
arr[i]=arr[length-1]; //抽到的数与数组最后一位进行互换
第三,两个抽奖人访问一个抽奖箱,即将抽奖箱设置为新的类实现Runnable接口,将两个抽奖人设置为线程对象。
WinPrize w=new WinPrize();
Thread w1=new Thread(w,"抽奖箱1");
Thread w2=new Thread(w,"抽奖箱2");
w1.start();
w2.start();
Thread 的构造方法有:
Thread()
‘’locates a new Thread object.
Thread(Runnable target)
‘’locates a new Thread object.
Thread(Runnable target, String name)
‘’locates a new Thread object.
Thread(String name)
‘’locates a new Thread object.