在Spring中使用@Async和@Scheduled时检测线程状态

时间:2017-04-18 12:42:46

标签: java spring multithreading spring-boot

我试图在Spring中实现以下要求。

我有两个正在运行的@Async个帖子,我们称之为t_At_B

t_A设置为@Scheduled注释,需要每30分钟运行一次(目前设置为5秒)。 t_B应该一直运行,除非t_A启动并在此时开始工作t_B将在 x 金额中睡眠并重新采样t_A状态几分钟,t_A完成作业t_B将继续工作,直到t_A再次启动。

目前我陷入了两个主要问题:

  1. 我不知道如何访问threadpoolexecutor以检查线程状态

  2. 使用@Scheduled时,线程似乎没有完成,似乎它只是在注释中设置的固定时间内休眠。

  3. 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于您的争用程度较低,因此简单的ReentrantLock应该可以胜任。

首先在t_At_B

之间创建共享锁
final ReentrantLock lock = new ReentrantLock();

在能够执行任务之前,t_At_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简化此代码。这取决于你试图通过锁实现的目标。