Jam*_*eeh 11 service grails multithreading
所以我设置了一个服务来从用户上传的文件中导入大量数据.我希望用户能够在处理文件时继续在网站上工作.我通过创建一个线程来完成这个.
Thread.start {
//work done here
}
Run Code Online (Sandbox Code Playgroud)
现在问题出现了,我不希望同时运行多个线程.这是我尝试过的:
class SomeService {
Thread thread = new Thread()
def serviceMethod() {
if (!thread?.isAlive()) {
thread.start {
//Do work here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.thread.isAlive()总是返回假.有关如何实现这一目标的任何想法?
Ian*_*rts 17
我会考虑Executor改用.
import java.util.concurrent.*
import javax.annotation.*
class SomeService {
ExecutorService executor = Executors.newSingleThreadExecutor()
def serviceMethod() {
executor.execute {
//Do work here
}
}
@PreDestroy
void shutdown() {
executor.shutdownNow()
}
}
Run Code Online (Sandbox Code Playgroud)
使用a newSingleThreadExecutor将确保任务一个接一个地执行.如果已经运行了后台任务,则下一个任务将排队,并在运行任务完成时启动(serviceMethod本身仍将立即返回).
如果您"在这里工作"涉及GORM数据库访问,您可能希望考虑执行程序插件,因为该插件将为您的后台任务设置适当的持久性上下文(例如Hibernate会话).