测试老兵 多线程验证--线程池内调用 okhttp3 的异步请求,是否会等异步请求结束再关闭线程池

CC · 2019年02月27日 · 986 次阅读

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

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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册