co.turnus.util.ProgressTheadPrinter.java Source code

Java tutorial

Introduction

Here is the source code for co.turnus.util.ProgressTheadPrinter.java

Source

/* 
 * TURNUS, the co-exploration framework
 * 
 * Copyright (C) 2014 EPFL SCI STI MM
 *
 * This file is part of TURNUS.
 *
 * TURNUS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * TURNUS is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with TURNUS.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Additional permission under GNU GPL version 3 section 7
 * 
 * If you modify this Program, or any covered work, by linking or combining it
 * with Eclipse (or a modified version of Eclipse or an Eclipse plugin or 
 * an Eclipse library), containing parts covered by the terms of the 
 * Eclipse Public License (EPL), the licensors of this Program grant you 
 * additional permission to convey the resulting work.  Corresponding Source 
 * for a non-source form of such a combination shall include the source code 
 * for the parts of Eclipse libraries used as well as that of the  covered work.
 * 
 */
package co.turnus.util;

import org.apache.commons.math3.fraction.BigFraction;

public class ProgressTheadPrinter extends Thread {

    public static final int DEFAULT_SLEEP = 100;

    private int currentValue;
    private final String message;
    private boolean run;
    private final int sleepTime;
    private long step;
    private final long steps;

    public ProgressTheadPrinter(String message, long steps) {
        this(message, steps, DEFAULT_SLEEP);
    }

    public ProgressTheadPrinter(String message, long steps, int sleepTime) {
        super("Turnus Progress Thread: " + message);
        this.message = (message != null ? message + ": " : "");
        this.steps = steps;
        this.sleepTime = sleepTime > 0 ? sleepTime : 1;
        currentValue = 0;
        step = 0;
        run = true;
    }

    public void finish() {
        run = false;
    }

    public void increment() {
        step++;
    }

    public void run() {
        SimpleTimer globalTimer = new SimpleTimer();
        SimpleTimer stepTimer = new SimpleTimer();

        final long stepsReduced = steps / 100;

        do {
            int val = stepsReduced != 0 ? new BigFraction(step, stepsReduced).intValue() : 0;

            if (val != currentValue) {
                currentValue = val;
                // if (val % 10 == 0) {
                TurnusLogger.info(message + val + "% after " + stepTimer.getElapsedTime() / 1000 + "s");
                stepTimer.reset();
                // }
            }

            try {
                Thread.sleep(sleepTime);
            } catch (Exception e) {
            }

        } while (run && step < steps);

        TurnusLogger.info(new StringBuilder().append(message).append("done in ")
                .append((int) (globalTimer.getElapsedTime() / 1000)).append("s").toString());
    }

    public void update(long step) {
        this.step = step;
    }

}