menu

秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

等待所有线程结束

不知道是不是重复发明了轮子。
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();