5、抽獎池抽獎線程管理實現

編程題目:

5.有一個抽獎池,該抽獎池中存放了獎勵的金額,該抽獎池用一個數組:

int[] arr = {10,5,20,50,100,200,500,800,2,80,300};

創建兩個抽獎箱(線程)設置線程名稱分別爲“抽獎箱1”,“抽獎箱2”,隨機從arr數組中獲取獎項元素並打印在控制檯上,格式如下:

抽獎箱1 又產生了一個 10 元大獎!

抽獎箱2 又產生了一個 100 元大獎!

…..

要求:獎金不可出現重複的,被抽走了就不能再出現了。

示例代碼:

package program.thread.exercise05;

import java.util.*;

/**
 * 5. 有一個抽獎池,該抽獎池中存放了獎勵的金額,該抽獎池用一個數組int[] arr = {10,5,20,50,100,200,500,800,2,80,300}; 
 * 創建兩個抽獎箱(線程)設置線程名稱分別爲“抽獎箱1”,“抽獎箱2”,隨機從arr數組中獲取獎項元素並打印在控制檯上,格式如下:
 * 抽獎箱1 又產生了一個 10 元大獎
 * 抽獎箱2 又產生了一個 100 元大獎    
 * .....
 * 要求:獎金不可出現重複的,被抽走了就不能再出現了
**/

public class RewardPool {
    public static void main(String[] args) {

        Reward reward = new Reward(); //創建獎金實例對象

        new Thread(reward,"抽獎箱1").start(); //啓動線程
        new Thread(reward,"抽獎箱2").start();

    }
}

//創建獎金類
class Reward implements Runnable {

    int[] arr = {10,5,20,50,100,200,500,800,2,80,300};//抽獎數額數組
    List<Integer> list = new ArrayList<Integer>();//用於存放隨機產生的數組下標

    @Override
    public void run() {
        while(true){
            synchronized (this) {
                int index = (int) (Math.random()*arr.length);//隨機獲取數組下標
                if(list.size() == arr.length){ //當集合長度等於數組長度,表明獎已經抽完
                    return;
                }
                if(!list.contains(index)){ //如果集合不包括隨機產生的下標,則添加下標
                    list.add(index);

                    try {
                        Thread.sleep(30);
                        String name = Thread.currentThread().getName();
                        if(name.equals("抽獎箱1")){
                            System.out.println(name+"又產生了一個 "+arr[index]+"元大獎");
                        }
                        if(name.equals("抽獎箱2")){
                            System.out.println(name+"又產生了一個 "+arr[index]+"元大獎");
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

結果顯示:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章