package com.example.mina.client.base; import java.time.ZonedDateTime; import lombok.extern.slf4j.Slf4j; @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 setRunning(boolean running) { isRunning = running; } 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; } @Override public void start() { if (progressListner != null) { progressListner.startExperiment(getExperimentId()); } while (isContinue()) { try { schedule(); iteratedTimes++; if (progressListner != null) { progressListner.updateProgress(getExperimentId(), iteratedTimes); } Thread.sleep(options.getPause() * 1000); } catch (Exception e) { log.info("thread sleep error", e); } } if (progressListner != null) { progressListner.stopExperiment(getExperimentId()); } } public void finish() { isRunning = false; } }