Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在grails中创建并发线程/承诺_Java_Multithreading_Groovy_Promise_Task - Fatal编程技术网

Java 在grails中创建并发线程/承诺

Java 在grails中创建并发线程/承诺,java,multithreading,groovy,promise,task,Java,Multithreading,Groovy,Promise,Task,我的grails应用程序中有一个操作,我希望在调用该操作时启动一个异步方法。我尝试使用承诺来实现这一点,但似乎task1是系统同步运行的。有人知道我如何使task1异步(并发)运行,并在action collector的同时进行处理吗 def collector(){ try{ Promise task1 = task { println "task1 - starting" console() //call anoth

我的grails应用程序中有一个操作,我希望在调用该操作时启动一个异步方法。我尝试使用承诺来实现这一点,但似乎task1是系统同步运行的。有人知道我如何使task1异步(并发)运行,并在action collector的同时进行处理吗

def collector(){

    try{

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

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

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

A。使用线程

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

1.开始

二,完

你好

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。使用

输出:

开始

结束

信息

使用Grails3:

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"
}
当我调用新线程({mytask();})时,start()第一个mytask()将被完全处理,并且只有在处理父线程之后才能继续。我希望(线程的调用方方法和线程)同时运行。它们是并行的,但要看到效果,您必须执行一个耗时的任务,尝试for循环10000次,您将看到
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"
}