一、前言
在实际开发中会出现这种场景,有多个接口请求数据,需要等到这几个接口都请求完后再执行后面的任务。大部分情况下接口网络操作都封装完成,只有一共回调可供操作,这里使用CountDownLatch、CyclicBarrier来进行处理。
二、代码演示
这里使用点击事件简化演示程序。代码如下(解开注释可以看到同样的结果):
package com.example.helloworld
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import java.util.concurrent.CountDownLatch
import java.util.concurrent.CyclicBarrier
//测试两次点击都出结果后再执行最后的逻辑
class MainActivity : AppCompatActivity() {
private val TAG = "YM-->${javaClass.name}"
// private val countDownLatch = CountDownLatch(2)
private val cyclicBarrier = CyclicBarrier(2){
finally()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Thread { finally() }.start()
}
fun onClick(v: View){
when(v.id){
R.id.one -> {
one()
}
R.id.two -> {
two()
}
}
}
private fun one(){
// Thread{
// Log.d(TAG,"---->one")
// countDownLatch.countDown()
// }.start()
Thread{
Log.d(TAG,"---->one")
cyclicBarrier.await()
}.start()
}
private fun two(){
// Thread{
// Log.d(TAG,"---->two")
// countDownLatch.countDown()
// }.start()
Thread{
Log.d(TAG,"---->two")
cyclicBarrier.await()
}.start()
}
private fun finally(){
// countDownLatch.await()
Log.d(TAG,"---->执行最后的逻辑")
}
}
三、附录Semaphore(信号量)
有一种场景是上面两种方式都无法实现的,这时候需要使用信号量来处理。
假如两种任务同时等待一个资源,这时候可以使用信号量来处理。举个例子就是,有两个动画需要执行,但是每一个动画执行的时候都需要在没有任何动画执行时候执行。这时候就可以引申出公共资源的问题。如果用常规的锁会比较麻烦。这里可以使用信号量来处理。