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

import java.time.ZonedDateTime;
import lombok.extern.slf4j.Slf4j;

@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 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;
    }

}