我试图在Spring中实现以下要求。
我有两个正在运行的@Async
个帖子,我们称之为t_A
和t_B
。
t_A
设置为@Scheduled
注释,需要每30分钟运行一次(目前设置为5秒)。 t_B
应该一直运行,除非t_A
启动并在此时开始工作t_B
将在 x 金额中睡眠并重新采样t_A
状态几分钟,t_A
完成作业t_B
将继续工作,直到t_A
再次启动。
目前我陷入了两个主要问题:
我不知道如何访问threadpoolexecutor以检查线程状态
使用@Scheduled
时,线程似乎没有完成,似乎它只是在注释中设置的固定时间内休眠。
有什么想法吗?
答案 0 :(得分:1)
由于您的争用程度较低,因此简单的ReentrantLock应该可以胜任。
首先在t_A
和t_B
:
final ReentrantLock lock = new ReentrantLock();
在能够执行任务之前,t_A
和t_B
必须获取锁定,锁定将强制执行只有一个任务(t_A或t_B)能够在给定的任务中执行时间:
<强> T_A:强>
@Scheduled(...)
public void process() {
// Acquire the lock, wait forever until the lock owner t_B release the lock
lock.lock();
try {
//do the job
} finally {
lock.unlock();
}
}
<强> T_B:强>
while (true) {
// try to acquire the lock, wait 500ms until the lock owner t_A release the lock
boolean acquired = lock.tryLock(500, TimeUnit.MILLISECONDS);
if (acquired) {
try {
//do the job
} finally {
lock.unlock();
}
}else{
// t_A is already running, output a log for example
}
}
请注意,由于您的争用很少(最多2个线程),因此可以使用synchronized
简化此代码。这取决于你试图通过锁实现的目标。