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