我目前有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秒的延迟非常重要。
我该如何解决这个问题?
答案 0 :(得分:1)
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