我有一组线程,其中我希望“计数”线程并行睡眠但在随机时间后唤醒(存储在该人的延迟中)。这段代码按顺序执行此操作。
Map<Thread,Person> threads=utils.getAllThreads();
Set<Thread> th=threads.keySet();
int count =5; //no of threads that go to sleep
System.out.println("count"+count);
Iterator it=th.iterator();
while(it.hasNext()){
if(count==0)
break;
Thread t=(Thread) it.next();
try{
t.suspend();
System.out.println(((Person)threads.get(t)).getName()+" is offline");
Thread.sleep(((Person)threads.get(t)).getDelayOffline());
//after sometime resume it
count--;
t.resume();
System.out.println(((Person)threads.get(t)).getName()+" back online");
}
catch(Exception ex){
}
所以,我想要
计算并行睡眠的线程数,并在随机时间后唤醒。
有没有办法改变Set?所以,每次不同的线程都会进入睡眠状态。
答案 0 :(得分:0)
**首先,我会认真考虑使用&#39;暂停&#39; **,它是一个麻烦的配方,特别是如果你的线程持有锁。
如果您需要暂停&#39;无论如何,你可能只是使用java.util.Timer并安排任务来唤醒线程。
Timer timer=new Timer();
// for each thread 't':
t.suspend();
final Thread tFinal=t;
// just a shortcut to allow my TimerTask to access 't' (alternatively you can
// have an explicit constructor for your TimerTask, and pass 't' to it)
timer.schedule(
new TimerTask() {
@Override public void run() {
tFinal.resume();
}
},
YOUR_RANDOM_VALUE);
显然存在变化,例如你有很多线程一再需要暂停和恢复,你可能还有一个TimerTask,每个执行30秒,并恢复所有符合条件的线程(假设你的睡眠时间远高于30秒 - 说整分钟 - 所以你可以忍受错误率为30)。
答案 1 :(得分:0)
对于扩展shuffle
且不适用于Set的集合,支持List
方法。但是如果您仍想这样做,那么您可以使用以下代码:
Map<Thread,Person> threads=utils.getAllThreads();
Set<Thread> th=threads.keySet();
List<Thread> list = new ArrayList<Thread>(th);
Collections.shuffle(list);
th.clear();
th.addAll(list);
这将是昂贵的。另一种选择是根据集合的大小生成一些随机数,然后从集合中选择那些项目。