java控制并发请求外部ocr等接口

注意:本文中没有请求ocr等例子,只是说明下java控制并发。

在开发中我们会碰到一些需要控制并发的情况,比如说我们请求外部接口时,外部接口不控制并发,需要我们自己控制并发。所以说本文说明一下自己的思路。

比如:

         需要控制的并发是5(只能同时发5个请求,一个请求回来就再发一个,最多5个)

         这个时候需要一个队列控制着并发

private static ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>();

         话不多说上代码

import java.util.*;
import java.util.concurrent.ConcurrentLinkedDeque;


public class ConcurrentService {

    private static final String AL_BABA_OCR_URL = "https://www.baidu.com";

    public static final ConcurrentService me = new ConcurrentService();

    /**
     * 控制并发队列(要使用线程安全的队列)
     */
    private static ConcurrentLinkedDeque<String> queue = new ConcurrentLinkedDeque<>();
    static {
        //把个数放进队列,要控制多少放到少,可以用别的方式我用的是这种
        Collections.addAll(queue,
                AL_BABA_OCR_URL,
                AL_BABA_OCR_URL,
                AL_BABA_OCR_URL,
                AL_BABA_OCR_URL,
                AL_BABA_OCR_URL);
    }

    /**
     * 获取队列链接,获取不到等待控制并发数
     *
     * @param data
     */
    public void getQueue(String data) {

        HttpExecuteResponse response = null;
        String url = "";
        try {
            while (true){
                url = queue.poll();
                //获取不到等待1S再次获取
                if(url == null){
                    System.out.println("未获取到链接线程休眠");
                    // 调用sleep方法让当前线程暂停1S。
                    Thread.sleep(1000);
                } else {
                    break;
                }
            }
            System.out.println(data + "拿到了url:" + url);
            //休眠2S 模拟真实操作(在这里写真实操作)
            Thread.sleep(2000);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //不管成功失败都要吧拿出队列中的在放回队列中
            queue.add(AL_BABA_OCR_URL);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        
        //开50个线程测试
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                me.getQueue(UUID.randomUUID().toString());
            }).start();
        }
    }

}

 

 

当使用 Java 生成 HttpClient 高并发请求第三方接口时,你可以使用 Apache HttpClient 库。以下是一个简单的示例代码: ```java import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ConcurrentHttpClientExample { public static void main(String[] args) { HttpClient httpClient = HttpClientBuilder.create().build(); ExecutorService executorService = Executors.newFixedThreadPool(10); // 并发线程池 // 发起并发请求 for (int i = 0; i < 100; i++) { executorService.execute(() -> { HttpGet httpGet = new HttpGet("https://api.example.com/endpoint"); // 替换为实际的接口地址 try { HttpResponse response = httpClient.execute(httpGet); BufferedReader reader = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); String line; StringBuilder responseContent = new StringBuilder(); while ((line = reader.readLine()) != null) { responseContent.append(line); } System.out.println("Response: " + responseContent.toString()); } catch (IOException e) { e.printStackTrace(); } }); } executorService.shutdown(); // 关闭线程池 } } ``` 在上述示例中,我们首先创建了一个 HttpClient 实例,并创建了一个具有固定线程数的线程池。然后使用线程池发起并发请求,每个线程执行一个 HttpGet 请求,并处理响应结果。 请注意,在实际使用中,你可能需要根据第三方接口的要求进行设置,如请求头、请求参数等。此外,还需要适当处理异常、重试机制和流量控制等情况,以保证请求的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值