一、 场景
在多种条件下要实现多个线程类,但是内容多半相似,只是部分逻辑不同,而且在改动或新增功能的时候这部分核心逻辑没有太大变化,主要在重复代码的地方进行改动,这时,如果有十个这样的文件,那就要改动十次,所以,要实现一个基础类,避免重复代码,提高耦合度。
二、 代码
// 基础类
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;
}
}
三、 结束
这是一个大致的思路,内容有缩减,可以效仿此逻辑实现你们自己的业务!!!