网络交互与线程同步

网络交互与线程同步

有以下场景

一个子线程中有两个网络请求任务,一个任务必须在另一个任务完成后才可以继续执行。

解决方法

使用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 = "";
      // 执行父线程的网络操作。。。
      
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值