【问题标题】:Create concurrent thread/promise in grails在 grails 中创建并发线程/承诺
【发布时间】:2017-04-13 12:12:49
【问题描述】:

我的 grails 应用程序中有一个操作,我想在调用该操作时启动一个异步方法。我正在尝试使用承诺来做到这一点,但似乎 task1 是同步运行的。有人知道我怎样才能让这个 task1 在动作收集器的同时异步(并发)运行吗?

def collector(){

    try{

        Promise task1 = task {
            println "task1 - starting"
            console() //call another method
            println "task1 - ending"
        }

        //do something
        ...
    }catch(){
       ....
    }

【问题讨论】:

    标签: java multithreading groovy promise task


    【解决方案1】:

    使用 Grails 3:

    import grails.async.Promise
    import static grails.async.Promises.task
    
    Promise p = task {
        // do stuff
    }
    p.onError { Exception err ->
        log.error( "Error during task $err" )
    }
    p.onComplete {
        log.info "Task completed"
    }
    

    【讨论】:

      【解决方案2】:

      异步运行代码片段的三种方式

      一个。使用线程

      def mytask={println "3.hello"}
      println "1.begin"
       new Thread( {
               mytask();
          }).start() 
      println "2.end"
      

      输出:

      1.开始

      2.结束

      3.你好

      B。使用事件

       import grails.events.Events
       
       @Consumer    
       class Game  implements Events{
          @Selector("play")
          def doPlay(Object msg) {
             println msg.toString()
          }
      }
      
      def gameScenarioService 
      
      //send event, will call doPlay method asyncrhonously
      notify ( "play", "First Play" )
      

      C。使用GPars

      @Grab(group='org.codehaus.gpars', module='gpars', version='1.2.1')
      
      import groovyx.gpars.actor.DefaultActor
       
      
      class CustomActor extends DefaultActor {
          @Override protected void act() {
              loop {
                  react {
                      println it
                  }
              }
          }
      }
      println "begin"
      def console=new CustomActor()
      console.start()
      
      //trigger to react
      console.send('Message')
      println "end"
      
      sleep(100) {
          // wait Message
      }
      

      输出:

      开始

      结束

      留言

      【讨论】:

      • 当我调用 new Thread( { mytask(); }).start() 首先 mytask() 被完全处理并且只有在我的父线程的处理继续之后。我希望两者(线程的调用者方法和线程)同时运行。
      • 他们并行,但是要看到效果,你必须执行一个耗时的任务,尝试for-loop 10000次你会看到
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2013-09-15
      相关资源
      最近更新 更多