等待所有线程结束
不知道是不是重复发明了轮子。
App完全退出(System.exit)之前,我需要确认所有线程的结束。这种线程其实有好多种,有AsyncTask实现的,有Thread实现的,我需要等这些都执行完了才能干净退出。
看了一下java.util.concurrent包,没有找到实现这种功能的,就做了一个,有需要的人可以随便拿去用。原理很简单:维持一个线程计数器,线程启动的时候加一,线程退出的时候减一。需要等待所有线程结束的时候,根据计数器新建一个CountDownLatch,await直到它减为0。
需要注意的是:默认认为调用await之后,不会再起任何线程了,如果还有需要的话,请自行修改代码。
package pw.ifyr.util;
import java.util.concurrent.CountDownLatch;
public class SyncUtil {
private static SyncUtil instance = new SyncUtil();
private final Object lock = new Object();
private CountDownLatch latch = null;
private int count = 0;
public static void countUp() {
instance.doCountUp();
}
public static void countDown() {
instance.doCountDown();
}
public static void await() {
instance.doAwait();
}
private void doAwait() {
synchronized (lock) {
if (count != 0 && latch == null) {
latch = new CountDown(latch);
}
}
if (latch != null) {
try {
latch.await();
} catch (InterruptedException ie) {
// do nothing
}
}
}
private void doCountUp() {
synchronized (lock) {
count ++;
}
}
private void doCountDown() {
synchronized (lock) {
count --;
if (latch != null) {
latch.countDown();
}
}
}
}
线程中调用:
//开始:
SyncUtil.countUp();
//结束:
SyncUtil.countDown();
退出前等待:
SyncUtil.await();
System.exit();