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

这题关键代码: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();
	}
}

 

你可能感兴趣的:(多线程,thread)