文档章节

守护线程的使用

o
 osc_fmg49rzg
发布于 2019/03/20 10:18
字数 504
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

最近有个需求,当一个线程开始时,需要实时判断这个线程是否存在,去修改一些值。

场景:.现在需要迁移一个公司的数据,异步操作。在系统中公司的数据如果在迁移,不能重复迁移。

// 发起迁移数据的进口,这里因为这个操作不常用,所以没有用线程池。
// 原因是,守护线程的限制。线程池,只是把线程放回线程池,没有销毁,所以守护线程无法判断到这个线程已经完成。
// 如果要使用线程池,可以在心跳守护线程中手动设置一个值控制
Thread thread= new Thread(new Runnable() { @Override public void run() { try { HeartbeatHelper.start(2, comId + "_" + module + "_trans"); dataTansService.dataTransfer(comId, module, instance); } catch (Exception e) { LOGGER.error("迁移公司[" + comId + "]的数据失败,原因:" + e.getMessage(), e); } } }); thread.start();
public class HeartbeatHelper {

    /**
     * 心跳缓存关键字前缀
     */
    private static final String ERP_HEARTBEAT_KEY_PREFIX = "HEARTBEAT_KEY_PREFIX_";
    private static CacheFacade cacheFacade = ApplicationContextManager.getBean(CacheFacade.class);
    
    /**
     * 启动心跳
     * @param key 关键字
     */
    public static void start(String key) {
        new HeartbeatDaemon(key).start();
    }

    /**
     * 判断心跳线程是否存在
     */
    public static boolean isLive(String key) {
        return PlatformUtils.hasText(cacheFacade.get(wrapKey(key)));
    }

    public static String wrapKey(String key) {
        return ERP_HEARTBEAT_KEY_PREFIX + key;
    }

    /**
     * 启动心跳
     * @param minute 心跳频率,单位分钟
     * @param key 关键字
     */
    public static HeartbeatDaemon start(int minute, String key) {
        HeartbeatDaemon daemon = new HeartbeatDaemon(minute,key);
        daemon.start();
        return daemon;
    }

    public static class HeartbeatDaemon extends Thread {

        /**
         * 守护的对象:即为创建该守护线程的线程对象
         */
        private final Thread guard;
        private static final String NAME_PREFIX = "guarding_";
        /**
         * 心跳频率为10分钟1次
         */
        private static final int HEART_RATE = 10;
        /**
         * 心跳频率,单位分钟
         */
        private final int rate;
        /**
         * 缓存关键字
         */
        private final String key;

        private Logger logger = LoggerFactory.getLogger(HeartbeatHelper.class);

        public HeartbeatDaemon(int minute, String key) {
            this.rate = minute * CommonPlatformConstant.SECOND_MINUTE;
            this.key = key;
            setDaemon(true);
            guard = Thread.currentThread();
            setName(NAME_PREFIX + guard.getName());
        }

        public HeartbeatDaemon(String key) {
            this(HEART_RATE, key);
        }

        @Override
        public void run() {
            while (guard.isAlive()) {
         // 守护的线程活着的时候做的事情
try {
             cacheFacade.set(wrapKey(key), DateUtils.formatDateTime(
new Date()), rate); } catch (Exception e) { logger.error("更新心跳失败:" + e.getMessage(), e); } try { // 休眠时间应该小于键的有效时间 Thread.sleep((rate -1) * CommonPlatformConstant.SECOND_OF_MILLISECOND); } catch (InterruptedException e) { logger.error("更新心跳休眠失败:" + e.getMessage(), e); } } } } }

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Kotlin Class「T」

fun <T> gotoMainPage( context: Activity, postId: String, mainActivity: Class<T> ) { val intent = Intent(context, ADSplash......

osc_qatrfv06
9分钟前
0
0
小赢科技2020年一季报:由盈转亏1.96亿,M3以下贷款逾期率翻倍达6.71%

来源 | 新金融一线 北京时间6月29日,美股上市互金平台小赢科技公布了今年一季报未经审计的财务业绩报告。财报显示,该公司2020财年第一财季净营收同比下降31.9%至5.29亿元(人民币,下同);...

镭射财经
10分钟前
5
0
kotlin实现单例

/** * 功能:单例实现 */class Singleton private constructor() { companion object { val instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { Si......

osc_5nscij7v
10分钟前
7
0
七月算法机器学习 11 决策树、随机森林、 adaboost

目录 主要内容 决策树 信息增益 三种决策树学习算法 决策树的例子 决策树的过拟合 Bootstraping Bagging的策略 随机森林 提升的概念 Adaboost 举例 主要内容 决策树  决策树学习采用的是自...

osc_2718ydlo
11分钟前
10
0
支持千万人次毫秒级交易,360金融的系统性能如何做到?

提到“系统性能”问题,便立即联想到刚刚过去的“618”购物狂欢,电商公司在面对高密集度并发交易行为时,依托强大的系统性能以保持用户在网购与支付过程中平台的系统稳定性的极致案例。系统...

osc_jrhexi1r
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部