Experiment.java 2.11 KB
package com.example.mina.client.base;

import lombok.extern.slf4j.Slf4j;

import java.time.ZonedDateTime;

@Slf4j
public abstract class Experiment <T extends MatrixClient, O extends ExperimentOptions> 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.getMaxIterCount() &&
                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;
    }

}