判断线程池中是否有任务正在执行

在使用线程池提交异步任务时,当需要做多用户互斥操作时,用户A在操作关键数据时,用户B也在操作,系统检测到A下发的数据任务还在执行则禁止用户B的下发的任务,可以通过判断线程池中是否存在正在执行的任务来操作,线程池提交任务后需要执行executor.shutdown(),然后在用户执行任务时调用executor.isTerminated()方法,存在任务则返回false,任务执行完毕返回true
但是此种方式不好,达不到复用线程池的目的,可将任务状态缓存到redis或者mysql中来做是否存在计算任务。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 判断线程池中是否存在存活的任务
 */
public class ExecutorDemo {
    private static int THREAD_NUM = 5;

    // 自己测试可以使用工具类Executors,实际项目中最好使用原生线程池ThreadPoolExecutor构造
    private static ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM);

    public static void main(String[] args) throws Exception{
        for(int i = 0; i < THREAD_NUM; i++){
            executor.submit(new Task(i));
        }

        executor.shutdown();

        System.out.println("线程池中是否存在正在执行的任务1: " + executor.isTerminated());

        TimeUnit.SECONDS.sleep(5);

        System.out.println("线程池中是否存在正在执行的任务2: " + executor.isTerminated());
    }

}

class Task implements Runnable{
    private int timeOut;

    public Task(int timeOut){
        this.timeOut = timeOut;
    }

    @Override
    public void run() {
        try {
            TimeUnit.SECONDS.sleep(timeOut);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(多线程并发)