多线程设计模式-半同步/半异步模式

本文介绍了半同步/半异步设计模式,通过AsyncTask和SyncTask分层处理任务,利用队列实现异步任务与同步任务间的通信。该模式能增加系统并发性,减少等待,同时保持编程的简洁性。在实际应用中,应根据任务耗时选择有界或无界队列,以优化系统性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义: 一个分层架构,将系统中的任务进行恰当地分解,使各个子任务落入合适的层次中

 

半同步/半异步模式UML图

AsyncTask: 异步任务,负责接收来自客户端的输入,对其进行初步处理,并通过队列与相应的同步任务通信
    dispatch: 对输入进行初步处理,并构造相应消息放入队列由相应的同步任务进行处理
Queue: 队列,异步任务层和同步任务层进行通信的中介
    enqueue: 消息入队列
    dequeue: 消息出队列
SyncTask: 同步任务,负责处理队列中的消息所对应的计算
    run: 执行同步任务

 

由于此处设计到部分其它模式使用的代码,就不一一贴出来了,具体可以从我的Github上查阅。

有时候,一些网络IO操作比较慢,做异步处理,一些处理相对来说较块,例如计数之类的,这种一般为同步模式。通过半同步/半异步的方式让两个处理速度不一致的任务互不影响。

package com.bruce.halfSyncHalfAsync;

import com.bruce.guardedSuspension.AlarmType;
import com.bruce.twoPhaseTermination.AlarmMgr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;

/**
* @Author: Bruce
* @Date: 2019/6/6 16:22
* @Version 1.0
*/
public class SampleAlarmClient {

    private final static Logger LOG = LoggerFactory.getLogger(SampleAlarmClient.class);

    private static final int ALARM_MSG_SUPRESS_THRESHOLD = 10;

    static {
        AlarmMgr.getInstance().init();
    }

    public static void main(String[] args) {
        SampleAlarmClient alarmClient = new SampleAlarmClient();
        Connection dbConn = null;
        try {
            dbConn = alarmClient.retrieveDBConnection();
        } catch (Exception e) {
            final AlarmMgr alarmMgr = AlarmMgr.getInstance();

            int duplicateSubmissionCount;
            String alarmId = "00000010000020";
            final String alarmExtraInfo = "operation=GetDBConnection;detail=Failed to get DB connection:"
                    + e.getMessage();

            duplicateSubmissionCount = alarmMgr.sendAlarm(AlarmType.FAULT, alarmId, alarmExtraInfo);
            if (duplicateSubmissionCount < ALARM_MSG_SUPRESS_THRESHOLD) {
                LOG.error("Alarm[" + alarmId + "] raised, extraInfo:" + alarmExtraInfo);
            } else {
                if (duplicateSubmissionCount == ALARM_MSG_SUPRESS_THRESHOLD) {
                    LOG.error("Alarm[" + alarmId + "] was raised more than " + ALARM_MSG_SUPRESS_THRESHOLD
                    + " times, it will no longer be logged.");
                }
            }
            return;

        }
        alarmClient.doSomething(dbConn);
    }

    private Connection retrieveDBConnection() throws Exception {
        Connection cnn = null;

        return cnn;
    }

    private void doSomething(Connection cnn) {
    }

}


半同步/半异步的优点:
增加系统的并发性,减少等待,保持同步编程的简单性。, 通常将耗时较短任务放在异步层,减少客户端的等待,提升系统吞吐率。,耗时较长任务放在同步层。
使用该模式需要根据实际情况选择有界队列和无界队列,有界队列可以在队列满的情况下,降低生产者的处理速率,减轻消费者的处理负担

 

参考资料

黄文海 Java多线程编程实战指南(设计模式篇)

黄文海的Github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值