比如有两个网络请求,分别在两个子线程里执行,得到数据后存在数据库里。主线程里需要用到他们执行后的数据,从数据库里读取。
这个时候就会出现一个问题,如果在请求后立马读取数据,是读不到的,因为子线程里的网络请求是耗时操作。
解决方法:主线程里开子线程前,写上final CountDownLatch latch = new CountDownLatch(2);//几个子线程就写几
,然后在每个子线程结束末尾写上latch.countDown();
在子线程执行完之后,写上:latch.await();
这个需要try/catch。这个时候就可以保证子线程全部执行完了。
19年6月4日补充:
之前的方法固然简单,但是存在线程阻塞的问题。这在某些 地方是坚决不能出现的,轻则界面动画卡顿,重则程序崩溃。所以,开发时应避免使用CountDownLatch
。
在安卓,通常使用Handler
去处理。设计一个等待子线程,里面就一个while
循环。当然,如果考虑到特殊情况,设置一个时间,超时就跳出。每个子线程执行完毕,用Message
通知主线程将一个记号变量加一。当子线程都执行完,所有的数据都拿到后,通过判断记号打破while循环,也就是等待子线程里写的Message,它通知主线程做最终的处理信息的操作。