首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 下載圖片線程卡死:輸入流讀取阻塞排查與超時設置

     編輯:程式設計綜合問答

現象

多線程下載圖片時,偶發卡死在 in.read(buf),線程無法結束,資源洩漏。

常見原因

  • 網絡抖動導致 TCP 連接半開狀態,讀取無限期阻塞
  • 服務端未正確關閉連接(缺少 Content-Length 或 Chunked 結束標記)
  • 無讀取超時設置,默認無限等待

解決方案

  1. 設置連接/讀取超時(關鍵):
    URL url = new URL(imgUrl);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(5000);   // 5s 連接超時
    conn.setReadTimeout(15000);     // 15s 讀取超時
    InputStream in = conn.getInputStream();
    
  2. 使用 try-with-resources 確保流關閉:
    try (BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
         BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file))) {
        byte[] buf = new byte[8192];
        int len;
        while ((len = in.read(buf)) != -1) out.write(buf, 0, len);
    }
    
  3. 加入調試日誌:記錄每次 read 返回值、耗時、異常堆疊,定位具體卡死環節

進階建議

生產環境推薦使用 OkHttp 或 Apache HttpClient,內建連接池、超時重試、取消機制,避免手動管理底層流。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved