Java多线程抽象基础类实现

一、 场景

        在多种条件下要实现多个线程类,但是内容多半相似,只是部分逻辑不同,而且在改动或新增功能的时候这部分核心逻辑没有太大变化,主要在重复代码的地方进行改动,这时,如果有十个这样的文件,那就要改动十次,所以,要实现一个基础类,避免重复代码,提高耦合度。

二、 代码

// 基础类

import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;

@Slf4j
public abstract class DeviceReadThread implements Runnable {

    /** 连接对象 */
    protected final Object connection;

    /** 读取间隔 */
    protected final int readInterval;

    /** 时间类型 */
    protected final String timeType;

    /** 是否取消 */
    protected volatile boolean cancelled = true;


    public DeviceReadThread(Object connection, String timeType, int readInterval) {
        this.connection = connection;
        this.timeType = timeType;
        this.readInterval = readInterval;
    }

    @Override
    public void run() {
        try {
            while (cancelled) {
                // 执行逻辑
            }
        } catch (Exception e) {
            log.error("Error in DeviceReadThread: {}", e.getMessage(), e);
        }
    }

    /**
     * 检查连接状态
     *
     * @return 连接是否成功
     */
    protected abstract boolean checkConnection();

    /**
     * 连接设备
     */
    protected abstract void connect();

    /**
     * 读取点位数据
     *
     * @return 读取后的结果
     */
    protected abstract String readData();


    /**
     * 线程睡眠时间
     *
     * @param interval 时间
     */
    protected void sleep(int interval) {
        try {
            if ("ms".equals(timeType)) {
                TimeUnit.MILLISECONDS.sleep(interval);
            } else {
                TimeUnit.SECONDS.sleep(interval);
            }
        } catch (InterruptedException e) {
            log.error("Thread interrupted: {}", e.getMessage(), e);
            Thread.currentThread().interrupt();
        }
    }

    /**
     * 停止读取
     */
    public void cancel() {
        cancelled = false;
    }
}
// 使用示例

import lombok.extern.slf4j.Slf4j;


@Slf4j
public class SiemensReadThread extends DeviceReadThread {

  
    private final String offset;

    
    private final int stringLength;

    public SiemensReadThread(String s, String dataType, String offset, int stringLength,String timeType, int readInterval) {
        super(s, timeType, readInterval);
        this.offset = offset;
        this.stringLength = stringLength;
    }

    @Override
    protected boolean checkConnection() {
        return true;
    }

    @Override
    protected void connect() {
        
    }

    @Override
    protected String readData() {
        try {
            return "实现逻辑"
        } catch (Exception e) {
            log.error("Error reading data from DataSiemensReadThread: {}", e.getMessage(), e);
            return null;
        }
    }

    @Override
    protected String getPointId() {
        return offset;
    }
}

三、 结束

        这是一个大致的思路,内容有缩减,可以效仿此逻辑实现你们自己的业务!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rabbit_pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值