Groovy GPars如何通过线程数/计数来休眠线程?

时间:2011-07-10 11:13:36

标签: multithreading grails groovy gpars

我目前有GPars的问题,我想开始大约30个线程,但我想在每个线程启动后等待1秒。

我的代码目前看起来像这样(Groovy / Grails):

withPool(30) {    // <= thread pool size
   Mail.findAllByStatus("new").eachWithIndexParallel { mail, i ->    // <= finds about 5000 mails
      sleep(i*1000)
      def doSomething = new Test()
      doSomething.do(mail) // <= runs for about 60sec
   }
}

此解决方案的问题是“eachWithIndexParallel”同时以随机顺序启动所有线程,例如5000邮件:
启动线程3500 =等待3500秒
启动线程1000 =等待1000秒
....直到30个线程启动然后它等待线程停止

我需要这样的解决方案:
开始线程2500 =等待1秒
开始线程5 =等待2秒
开始线程4888 =等待3秒
...直到30个线程启动然后它等待线程停止

如果我只是使用一个计数变量,那么我就会遇到这样的问题:由于同时启动,多个线程具有相同的计数值...而且每个线程之间有1秒的延迟非常重要。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

嗯,我不是GPars专家,但我不认为这是一个GPars问题。如何创建一个线程都调用的同步函数来找出它们的延迟是什么?

private static delaycount = 1;
public synchronized int getMyDelay() {
   return delaycount++;
}

并将您的代码更改为:

int mydelay = getMyDelay()
sleep(mydelay*1000)
def doSomething = new Test()
doSomething.do(mail) // <= runs for about 60sec

在Mail.find ....

答案 1 :(得分:0)

或使用原子整数

肯定如果延迟很重要,不要依赖于索引的值,我应该在枚举线程中使用它

我也不认为30个线程会停止并等待对方 只要n <30,

,新线程就会继续产生

这可能会破坏拥有30个线程的好处,延迟1 ... 30秒

无论如何要强制这样做 您可能需要一个能够保持下一个需要延迟的队列 这样,无论哪个线程释放,都会从1..30

中未使用的数字中获取延迟x