国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡

這篇具有很好參考價(jià)值的文章主要介紹了CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

錯(cuò)誤描述:

????????我設(shè)置了CountDownLatch對線程的協(xié)作做出了一些限制,但是我發(fā)現(xiàn)運(yùn)行一段時(shí)間以后便發(fā)現(xiàn)定時(shí)任務(wù)不運(yùn)行了。

具體代碼:

public void sendToCertainWeb() throws IOException, InterruptedException {
        List<String> urlList = scheduleplanMapper.getRandomUrlList();
        Thread.sleep(6000);
        CountDownLatch countDownLatch = new CountDownLatch(20);
        for (String s : urlList) {
            transportThreadPool.execute(()->{
                try {
                    URL url = new URL(s);
                    // 打開連接
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                    // 設(shè)置請求方法為GET
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(100000);
                    connection.setReadTimeout(100000);

                    // 添加自定義的請求頭信息
                    String agent = scheduleplanMapper.getRandomAgent();
                    connection.addRequestProperty("User-Agent", agent);
                    connection.addRequestProperty("Accept-Language", "en-US,en;q=0.9");

                    // 獲取服務(wù)器返回的狀態(tài)碼
                    int responseCode = connection.getResponseCode();

                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        // 讀取服務(wù)器返回的數(shù)據(jù)
                        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                        String line;
                        StringBuilder response = new StringBuilder();

                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                        }
                        reader.close();
                        log.info("Right Code: " + responseCode);
                    } else {
                        log.error("Error Code: " + responseCode);
                    }

                    // 關(guān)閉連接
                    connection.disconnect();
                    countDownLatch.countDown();
                }catch (Exception e){
                    log.error(JSON.toJSONString(e));

                }

            });
        }
        countDownLatch.await();
    }

報(bào)錯(cuò)以后定時(shí)任務(wù)不運(yùn)行了?

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

錯(cuò)誤排查:

?打印線程日志發(fā)現(xiàn)定時(shí)任務(wù)的線程在第86行代碼停著不動(dòng)了。

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

正常的線程日志應(yīng)該是這樣的。

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

查看第86行代碼,發(fā)現(xiàn)這里并沒有喚醒主線程 ,導(dǎo)致線程一直處于運(yùn)行狀態(tài),無法繼續(xù)下一個(gè)任務(wù)。

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

????????錯(cuò)誤的原因是countDownLatch.countDown()并沒有放在finally塊里因此發(fā)生了錯(cuò)誤并不會(huì)走這塊代碼,導(dǎo)致線程沒有countDown

CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡,windows

錯(cuò)誤修改:

把countDownLatch.countDown();放在finally代碼塊里保證一定會(huì)進(jìn)行countDown這個(gè)動(dòng)作

正確代碼:

    public void sendToCertainWeb() throws IOException, InterruptedException {
        List<String> urlList = scheduleplanMapper.getRandomUrlList();
        Thread.sleep(6000);
        CountDownLatch countDownLatch = new CountDownLatch(20);
        for (String s : urlList) {
            transportThreadPool.execute(()->{
                try {
                    URL url = new URL(s);
                    // 打開連接
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

                    // 設(shè)置請求方法為GET
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(100000);
                    connection.setReadTimeout(100000);

                    // 添加自定義的請求頭信息
                    String agent = scheduleplanMapper.getRandomAgent();
                    connection.addRequestProperty("User-Agent", agent);
                    connection.addRequestProperty("Accept-Language", "en-US,en;q=0.9");

                    // 獲取服務(wù)器返回的狀態(tài)碼
                    int responseCode = connection.getResponseCode();

                    if (responseCode == HttpURLConnection.HTTP_OK) {
                        // 讀取服務(wù)器返回的數(shù)據(jù)
                        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

                        String line;
                        StringBuilder response = new StringBuilder();

                        while ((line = reader.readLine()) != null) {
                            response.append(line);
                        }
                        reader.close();
                        log.info("Right Code: " + responseCode);
                    } else {
                        log.error("Error Code: " + responseCode);
                    }

                    // 關(guān)閉連接
                    connection.disconnect();

                }catch (Exception e){
                    log.error(JSON.toJSONString(e));
                }finally {
                    countDownLatch.countDown();
                }

            });
        }
        countDownLatch.await();
    }

錯(cuò)誤總結(jié):

?????????我們一般認(rèn)為線程處于blocked狀態(tài)的時(shí)候線程才是處于阻塞狀態(tài),但是這個(gè)狀態(tài)只是對于計(jì)算機(jī)來說的。對于我們來說,只要業(yè)務(wù)不執(zhí)行了,線程就是處于阻塞狀態(tài)的,因此任何狀態(tài)下的線程對于業(yè)務(wù)來說都是阻塞的。 我這個(gè)項(xiàng)目是爬蟲項(xiàng)目,會(huì)去爬取別人網(wǎng)站的數(shù)據(jù),有些網(wǎng)站識(shí)別爬蟲之后不僅會(huì)拒絕你訪問,還會(huì)通過一直不給響應(yīng)使得你的服務(wù)器線程占滿,進(jìn)而導(dǎo)致你的爬蟲服務(wù)器崩潰。

參考文章:?

未設(shè)置超時(shí)時(shí)間導(dǎo)致線程池資源耗盡,排查過程-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-856963.html

到了這里,關(guān)于CountDownLatch使用錯(cuò)誤+未最終斷開連接導(dǎo)致線程池資源耗盡的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • WPF 已知問題 傳入錯(cuò)誤數(shù)據(jù)給到 WriteableBitmap 可能導(dǎo)致渲染線程鎖住

    本文記錄一個(gè) WPF 已知問題,此問題已經(jīng)被我修復(fù)。傳入錯(cuò)誤的數(shù)據(jù)給到 WriteableBitmap 對象,比如調(diào)用 WritePixels 時(shí)傳入錯(cuò)誤的 stride 數(shù)值,將可能導(dǎo)致渲染線程進(jìn)入無限自旋鎖 應(yīng)用程序停止渲染,或者是界面未響應(yīng)。表現(xiàn)是在 渲染 線程卡住,從任務(wù)管理器看可以看到有一個(gè)

    2024年02月09日
    瀏覽(24)
  • 記一次swoole連接數(shù)太多導(dǎo)致的錯(cuò)誤

    原先就有點(diǎn)擔(dān)心這個(gè)項(xiàng)目正式上線會(huì)出現(xiàn)各種問題,所以剛上線就趕緊查看日志 果然,頻繁出現(xiàn)錯(cuò)誤: WARNING Server::accept_connection(): accept() failed, Error: Too many open files[24] 這個(gè)錯(cuò)誤通常是由于操作系統(tǒng)限制了進(jìn)程能夠打開的文件句柄數(shù)量,導(dǎo)致當(dāng)前進(jìn)程無法打開更多的文件,從

    2024年02月02日
    瀏覽(31)
  • FileZilla僅開放21端口導(dǎo)致連接超時(shí)錯(cuò)誤:讀取目錄列表失敗

    FileZilla僅開放21端口導(dǎo)致連接超時(shí)錯(cuò)誤:讀取目錄列表失敗

    條件: ? ? ? ? 部署FileZilla Server后,在防火墻內(nèi)打開21端口入站。 ? ? ? ? 另一臺(tái)機(jī)器使用FileZilla連接服務(wù)器,卡在如下: ????????????????狀態(tài):?? ?連接建立,等待歡迎消息... ????????????????狀態(tài):?? ?初始化 TLS 中... ????????????????狀態(tài):?? ?

    2024年02月05日
    瀏覽(19)
  • 巧用CountDownLatch實(shí)現(xiàn)多線程并行工作

    【前言】 ????? CountDownLatch 是JDK提供的一個(gè)同步工具,它可以讓一個(gè)或多個(gè)線程掛起等待,一直等到其他線程執(zhí)行完成才會(huì)繼續(xù)執(zhí)行。常用方法有 countDown 方法和 await 方法, CountDownLatch 在初始化時(shí),需要指定一個(gè)整數(shù)n作為計(jì)數(shù)器。當(dāng)調(diào)用 countDown 方法時(shí),計(jì)數(shù)器會(huì)被減1;

    2024年02月13日
    瀏覽(20)
  • 【Java基礎(chǔ)】線程同步類 CountDownLatch

    ? 關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做日活千萬級APP。 專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長java后端、移動(dòng)開發(fā)、人工智能等,希望大家多多支持。 正好今天項(xiàng)目中用到了CountDownLatch,那我們正好總結(jié)一下,通過本文你可以學(xué)到什么是CountDownLatch及其原理,

    2024年02月12日
    瀏覽(24)
  • 使用java完成WebSocket自動(dòng)主動(dòng)斷開連接功能

    一個(gè)頁面實(shí)時(shí)刷新的功能,頁面上的數(shù)據(jù)狀態(tài)可能會(huì)隨著操作實(shí)時(shí)改變,所以每個(gè)用戶在使用的時(shí)候都希望能看到數(shù)據(jù)的最新狀態(tài)。 我想到了兩種解決方法:1.輪循,2.WebSocket 我們這里采用的是WebSocket來解決問題 WebSocket在建立連接后,如果不是人為操作的話,他不會(huì)主動(dòng)地進(jìn)

    2024年02月07日
    瀏覽(19)
  • mac使用VsCode遠(yuǎn)程連接服務(wù)器總是自動(dòng)斷開并要求輸入密碼的解決辦法

    mac使用VsCode遠(yuǎn)程連接服務(wù)器總是自動(dòng)斷開并要求輸入密碼的解決辦法

    在mac中使用vscode遠(yuǎn)程連接服務(wù)器,時(shí)常會(huì)出現(xiàn)自動(dòng)斷開并要求重新輸入服務(wù)器密碼的問題,接下來讓我們來解決它: 1、首先,在本地創(chuàng)建公鑰: 這條命令執(zhí)行之后,出現(xiàn)提示直接回車即可;直到遇到Overwrite (y/n)? ?輸入y,之后繼續(xù)回車,如下圖: ?2、將本地mac密匙的 id_rs

    2024年02月10日
    瀏覽(28)
  • 原子類-入門介紹和分類說明、基本類型原子類、Join和CountDownLatch都可以讓一個(gè)線程等待子線程完成

    原子類-入門介紹和分類說明、基本類型原子類、Join和CountDownLatch都可以讓一個(gè)線程等待子線程完成

    Atomic翻譯成中文是原子的意思。在化學(xué)上,我們知道原子是構(gòu)成一般物質(zhì)的最小單位,在化學(xué) 反應(yīng)中是不可分割的。在我們這里Atomic是指一個(gè)操作是不可中斷的。即使是在多個(gè)線程一起執(zhí) 行的時(shí)候,一個(gè)操作一旦開始,就不會(huì)被其他線程干擾。 基本類型原子類 AtomicInteger :

    2024年01月20日
    瀏覽(26)
  • 線程池使用不規(guī)范導(dǎo)致線程數(shù)大以及@Async的規(guī)范使用

    文章詳細(xì)內(nèi)容來自:線程數(shù)突增!領(lǐng)導(dǎo):誰再這么寫就滾蛋! 下面是看完后文章的,一個(gè)總結(jié) 線程池的使用不規(guī)范,導(dǎo)致程序中線程數(shù)不下降,線程數(shù)量大。 臨時(shí)變量的接口,通過下面簡單的線程池執(zhí)行, 線程不被GC回收,主要是線程池的gc root還是有可達(dá)路徑的。這里講個(gè)

    2024年02月10日
    瀏覽(16)
  • 【調(diào)試記錄】QT中使用多線程導(dǎo)致的死鎖

    原因在于第18行采用阻塞隊(duì)列的連接方式。 子線程在第17行獲取到鎖,主線程剛好運(yùn)行到24行準(zhǔn)備獲取鎖。此時(shí)子線程執(zhí)行第18行,阻塞調(diào)用等待主線程執(zhí)行 qDebug() \\\"invokeMethod:\\\" ++count_; 完成。 子線程已經(jīng)獲取到鎖,主線程等待獲取鎖,子線程又等待主線程事件循環(huán)執(zhí)行函數(shù),由

    2023年04月16日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包