multithreading - 在 Grails 服务中管理线程

标签 multithreading grails service

所以我设置了一个服务来从用户上传的文件中导入大量数据。我希望用户能够在处理文件时继续在站点上工作。我通过创建一个线程来实现这一点。

Thread.start {
 //work done here
}

现在问题出现了,我不想让多个线程同时运行。这是我尝试过的:
class SomeService {

Thread thread = new Thread()

 def serviceMethod() {
   if (!thread?.isAlive()) {
     thread.start {
        //Do work here
     }
   }
 }

}  

但是,这不起作用。 thread.isAlive()总是返回假。关于我如何做到这一点的任何想法?

最佳答案

我会考虑使用 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()
 }

}

使用 newSingleThreadExecutor将确保任务一个接一个执行。如果有一个后台任务已经在运行,那么下一个任务将排队并在正在运行的任务完成时开始(serviceMethod 本身仍然会立即返回)。

您不妨考虑 executor plugin如果您的“在这里工作”涉及 GORM 数据库访问,那么该插件将为您的后台任务设置适当的持久性上下文(例如 Hibernate session )。

关于multithreading - 在 Grails 服务中管理线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845026/

相关文章:

windows - 使用 sc.exe 启动创建的服务会引发错误 : "[SC] StartService FAILED with error 129."

excel - 导出 Excel 内部服务

linux - 如何让我的程序在保持响应的同时长时间休眠?

java - JSVC Java Daemon 需要改进性能

C#启动一个静态线程

grails - 设置任务,设置不同的环境

java - 我如何修改我的代码才能避免死锁?

grails - java.lang.IllegalArgumentException:属性[密码]在Grails中不是com.wolf.User类的有效属性。

xml - 使用Grails渲染命令控制XML格式的换行符

Android:我可以在服务中使用 Google Analytics 吗?