【问题标题】:Groovy GPars how to sleep a thread by thread number/count?Groovy GPars如何按线程数/计数休眠线程?
【发布时间】:2011-07-10 11:13:35
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: multithreading grails groovy gpars


    【解决方案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....

    【讨论】:

    • 感谢它有效 :),我对 java/groovy 很陌生,我什至不知道有类似同步函数的东西
    【解决方案2】:

    或使用原子整数

    如果延迟很重要,请不要依赖索引的值,i 确实应该用于枚举线程

    我也不认为这 30 个线程会停止并互相等待 只要 n

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2011-06-01
      • 2019-08-12
      • 1970-01-01
      相关资源
      最近更新 更多