网络交互与线程同步
有以下场景
一个子线程中有两个网络请求任务,一个任务必须在另一个任务完成后才可以继续执行。
解决方法
使用CountDownLatch+Thread
具体示例如下:
public class SaveMSThread implements Runnable {
private Handler handler;
int insCount = 0;
// 用于保持线程同步,当一个线程执行完毕后再执行另一个线程
private CountDownLatch latch;
public SaveMSThread() {
}
// 初始化参数较多,后期采用建造者设计模式优化
public SaveMSThread(Handler handler, int criNum, Double[][] judgmentMatrix, List<String> criteriaList) {
this.handler = handler;
// 初始化CountDownLatch并且设置门闩上的锁个数为1这个数值根据在主线程继续执行之前要执行的子线程数决定
latch = new CountDownLatch(1);
}
@Override
public void run() {
Log.e("saveMS","SaveThread");
String url = “”;
Message message = new Message();
Bundle msgBundle = new Bundle();
Log.e("url",url);
new Thread(()->{
// 在子线程中保存数据,等待数据全部保存完毕,父线程再继续运行
// 耗时操作
if (insCount == 20){
// 如果保存的个数正确
// 门闩计数-1说明主线程可以继续执行
latch.countDown();
Log.e("全部保存完毕,保存个数",String.valueOf(insCount));
}
}).start();
try {
Log.e("等待",String.valueOf(latch.getCount()));
// 使用CountDownLatch阻塞父线程等待直到子线程执行到想要的结果
latch.await();
Log.e("等待结束",String.valueOf(latch.getCount()));
} catch (InterruptedException e) {
e.printStackTrace();
}
String norUrl = "";
// 执行父线程的网络操作。。。
}
}