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