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 校验结果

线程池会等待整个异步请求全部请求完毕之后,再关闭线程


↙↙↙阅读原文可查看相关链接,并与作者交流