使线程并行睡眠,每个线程都有随机的时间

时间:2015-04-29 11:44:02

标签: java multithreading

我有一组线程,其中我希望“计数”线程并行睡眠但在随机时间后唤醒(存储在该人的延迟中)。这段代码按顺序执行此操作。

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){

}

所以,我想要

  1. 计算并行睡眠的线程数,并在随机时间后唤醒。

  2. 有没有办法改变Set?所以,每次不同的线程都会进入睡眠状态。

2 个答案:

答案 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);

这将是昂贵的。另一种选择是根据集合的大小生成一些随机数,然后从集合中选择那些项目。