package com.example.mina.client.base; import lombok.extern.slf4j.Slf4j; import java.time.ZonedDateTime; @Slf4j public abstract class Experiment extends Thread{ protected T client; protected O options; protected int iteratedTimes; //this is used for stop the task manually private volatile boolean isRunning; protected ExperimentProgressListner progressListner; public Experiment() { } public Experiment(T client, O options) { this.client = client; this.options = options; this.setName(getExperimentTaskName()); this.iteratedTimes = 0; } private String getExperimentTaskName() { return String.format("%s-%s", this.client.getDeviceType(), this.client.getDeviceName()); } public void setClient(T t) { this.client = t; } public void setOptions(O options) { this.options = options; } public void setProgressListner(ExperimentProgressListner experimentProgressListner) { this.progressListner = experimentProgressListner; } public String getExperimentId() { return options.getExperimentId(); } abstract public String getExperimentName(); abstract public void schedule(); public void sendCommand(MatrixCommand command){ client.sendCommand(command); } public boolean isContinue() { return iteratedTimes < options.getIterations() && ZonedDateTime.now().isBefore(options.getFinishAt()) && isRunning; } public void start() { progressListner.startExperiment(getExperimentId()); while (isContinue()) { try{ schedule(); iteratedTimes++ ; progressListner.updateProgress(getExperimentId(), iteratedTimes); Thread.sleep(options.getPause() * 1000); }catch (Exception e) { log.info("thread sleep error", e); } } progressListner.stopExperiment(getExperimentId()); } public void finish() { isRunning = false; } }