【多线程】做一个放号器, 多个线程同时申请号码不重复.

这题关键代码:synchronized(temp)  //同步锁锁定号码集合temp

import java.util.ArrayList;
import java.util.List;

/**
 * @author $KangMiao$
 * 做一个放号器, 多个线程同时申请号码不重复. 
 * 比如: 线程1 : 1, 4, 5,… 线程2 : 2, 3, 7… 线程2 :6,8,9...
 */
public class ApplyNum implements Runnable {
	private Integer index;
	private List<Integer> temp;
	//初始化一个集合 用来放1-100的号码
	{
	    temp = new ArrayList<Integer>();
		for (int i = 1; i <= 100; i++) {
			temp.add(i);
		}
	}

	public void run() {
	   while(temp.size()!=0){
		   synchronized(temp){   //同步锁锁定号码集合temp
			 if(temp.size()!=0){  //防止前面等待当前线程解锁的线程 因为号码器为空而报异常
				int leng = temp.size();
				index = (int) (Math.random() * leng);   //随机获得一个 集合的索引值
				System.out.println(Thread.currentThread().getName() + "申请的号码为:"
						+ temp.get(index));             //打印出索引值对应的号码
				temp.remove(temp.get(index));           //删除被申请过的号码
			  }else
				   System.out.println(Thread.currentThread().getName() +"号码已经取完!");
		   }
		}
	}

	public static void main(String[] args) {
		//实例化一个 与实例化多个对象 效果完全不一样,多个又重新分配多个号码集合
		ApplyNum ay1 = new ApplyNum();
//		ApplyNum ay2 = new ApplyNum();
		new Thread(ay1).start();
		new Thread(ay1).start();
		new Thread(ay1).start();
		new Thread(ay1).start();
		new Thread(ay1).start();
		new Thread(ay1).start();
		new Thread(ay1).start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值