1 package com.android.development; 2 3 public class ProgressBar { 4 5 private final String mLabel; 6 private final long mMax; 7 private final Thread mThread; 8 9 private final Object lock = new Object(); 10 11 private volatile int mCurPercent = 0; 12 private volatile boolean mRunning = true; 13 ProgressBar(String label, long max)14 public ProgressBar(String label, long max) { 15 mLabel = label; 16 mMax = max; 17 mThread = new Thread(this::loop); 18 mThread.start(); 19 } 20 update(long value)21 public void update(long value) { 22 synchronized (lock) { 23 int p = (int) ((100 * value) / mMax); 24 25 if (p != mCurPercent) { 26 mCurPercent = p; 27 lock.notify(); 28 } 29 } 30 } 31 finish()32 public void finish() { 33 mRunning = false; 34 synchronized (lock) { 35 lock.notify(); 36 } 37 try { 38 mThread.join(); 39 } catch (InterruptedException e) { } 40 } 41 loop()42 private void loop() { 43 while (mRunning) { 44 synchronized (lock) { 45 System.out.print('\r'); 46 System.out.print(mLabel + ": " + mCurPercent + "%"); 47 try { 48 lock.wait(); 49 } catch (InterruptedException e) { } 50 } 51 } 52 System.out.print('\r'); 53 System.out.println(mLabel + ": Done"); 54 } 55 } 56