0

我目前有一个 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 秒的延迟非常重要。

我怎么解决这个问题?

4

2 回答 2

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里面......

于 2011-07-10T16:12:52.437 回答
0

或使用原子整数

绝对如果延迟很重要,请不要依赖索引的值,我应该在枚举线程时使用它

我也不认为这 30 个线程会停止并互相等待,只要 n<30,新线程就会继续产生,

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

无论如何,要强制执行此操作,您可能需要一个队列来保存下一个要求延迟,这样无论哪个线程释放,都会从 1..30 中未使用的数字中获取延迟 x

于 2011-07-10T18:53:53.457 回答