首页 > 编程语言 > 详细

多线程并发防止资源争抢工具类 函数式编程

时间:2021-01-21 16:37:00      阅读:42      评论:0      收藏:0      [点我收藏+]
package cn.com.util;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class ConcurrentUtils {

    // 初始化公平锁
    private static final ReentrantLock lock = new ReentrantLock(true);

    private static final Map<String, String> JOB_CONTEXT = new ConcurrentHashMap();

    public static void run(TaskFunction function) throws Exception {
        if (lock.tryLock(3, TimeUnit.SECONDS)) {
            // 执行任务-适用于耗时较短的任务
            try {
                function.run();
            } catch (Exception e) {
                throw e;
            } finally {
                lock.unlock();
            }
        }
    }


    /**
     * 适用于可以分类的任务并发执行
     * @param jobCode 任务分类
     * @param function
     * @throws Exception
     */
    public static void run(String jobCode, TaskFunction function) throws Exception {
        if (lock.tryLock(3, TimeUnit.SECONDS)) {
            try {
                // 再次判断, 提高首次并发效率
                if (!JOB_CONTEXT.containsKey(jobCode)) {
                    JOB_CONTEXT.put(jobCode, Thread.currentThread().getName());
                } else {
                    return;
                }
            } finally {
                lock.unlock();
            }
            // 执行任务-耗时较长-所以加锁加在上面-提高并发效率
            try {
                function.run();
            } catch (Exception e) {
                throw e;
            } finally {
                JOB_CONTEXT.remove(jobCode);
            }
        }
    }

    @FunctionalInterface
    public static interface TaskFunction {
        void run();
    }

}

 使用示例:

for (String jobCode : jobCodeList) {
    // jobCode -- 任务分类标识
    ConcurrentUtils.run(jobCode, () -> {
        try {
            // 本次的任务
            this.job();
        } catch (Exception e) {            
            log.error("job run error!", e);
        }
    });
}

 

多线程并发防止资源争抢工具类 函数式编程

原文:https://www.cnblogs.com/bevis-byf/p/14308237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!