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