在Grails Services中管理线程

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会话).