0x01 需求
回放检测平台出现了共享资源被抢占,无法释放导致死锁问题,排查问题之后,需要优化关键的几块代码
0x02 采取方案
线程池形式下载多路回放,采用 Semaphore 信号量方式控制线程池数量;
对应线程异步下载该回放的 ts 文件 (差不多有 600+ 文件);
0x03 存在疑问
因为不确定线程调用异步请求时,是否会发送请求之后直接就结束线程了?还是会等待异步请求全部完成之后再结束线程
0x04 代码校验
package com.hero.cases;
import com.beust.jcommander.internal.Maps;
import com.hero.common.okhttpclient.OkHttpClientCallBack;
import com.hero.common.okhttpclient.OkHttpClientMethod;
import net.sf.json.JSONObject;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* @Des:
* @Auther: 飞狐
* @Date: 2019/2/27
*/
public class MultThreadTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(3);
for(int i = 0; i < 10; i ++){
executorService.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + "--目前并发的线程: " + (3 - semaphore.availablePermits()));
MultThreadTest multThreadTest = new MultThreadTest();
multThreadTest.test2();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
executorService.shutdown();
}
public void test1(){
int n = 0;
for(int i = 0; i < 20; i ++){
n++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("当前的n为:" + n);
}
public void test2(){
String url = "https://xxxxx/api/v1.0/services/openAppRecord/xxx";
Map<String,Object> headers = Maps.newHashMap();
for(int i = 0 ;i < 10; i++) {
OkHttpClientMethod.getInstance().postJsonAsyncMethod(url, Maps.newHashMap(), new JSONObject(), Maps.newHashMap(), new OkHttpClientCallBack());
}
}
}
0x05 校验结果
线程池会等待整个异步请求全部请求完毕之后,再关闭线程
转载文章时务必注明原作者及原始链接,并注明「发表于 TesterHome 」,并不得对作品进行修改。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。