2012-05-16 51 views
1

我在開放目錄項目(ODP)中使用URL實現多線程Wget。我收到以下錯誤:太多的開放線程錯誤

java.io.FileNotFoundException: log (Too many open files) 
at java.io.FileOutputStream.openAppend(Native Method) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:207) 
at java.io.FileOutputStream.<init>(FileOutputStream.java:131) 
at java.io.FileWriter.<init>(FileWriter.java:78) 
at ODP.run(ODP.java:103) 

我讀過,這是因爲它立交橋在系統變量指定打開的文件描述符的限制:執行cat/proc/SYS/FS /文件的最大

有沒有辦法限制可以同時啓動的線程數?我認爲它是由可以運行CPU的線程數自動完成的。

謝謝!

編輯:這是主要的方法裏面的主循環:

 while (rs.next()) {     
      // Process entry 
      String rsc = rs.getString ("resource"); 
      String tpc = rs.getString("topic");    
      (new ODP(rsc, tpc, rs.getString("description"))).start(); 
      BufferedWriter outLog = new BufferedWriter(new FileWriter("log", true)); 
    outLog.write(count + ": " + rsc + " | " + tpc + "\n"); 
    outLog.close(); 
      ++count;     
     } 

ODP.run()方法創建一個BufferedWritter:

 BufferedWriter out = new BufferedWriter(new FileWriter(cat.split("/")[1] + ".webtrec", true)); 
     out.write(webtrec); 
     out.close(); 

回答

0

Is there a way to limit the number of threads that can be started at the same time?

是的,通過使用某種線程池。如果您使用Java 1.5或更高版本,那麼您很幸運;您可以使用ThreadPoolExecutor來限制併發線程的數量。

3

你似乎線程文件整個你的問題。

大多數操作系統對給定進程可能打開的文件描述符數量有限制。這包括文件系統上的實際文件,通常還包括諸如數據庫或服務器連接等套接字。 (這與您的進程中運行的線程數沒有任何關係。)

如果您當前持有打開文件句柄的最大數量,則您的進程將無法再打開。這通常是資源泄漏的標誌 - 即您沒有正確關閉您的I/O資源。 非常少很少,如果您的應用程序合法需要從數以萬計的文件同時讀取,您是否需要增加操作系統限制。

在您的ODP.run方法中,您是否在循環中創建FileWriters,但未能對其調用close()

+0

我把我如何處理ODP.run方法中的filewriter的代碼。如你所見,我將它關閉。每個線程都會打開一個文件描述符,因此線程的數量與特定時刻的文件描述符的數量有關。 – synack

+1

我想如果他產生了10000個線程,每個線程運行上面的代碼,他也會得到太多的文件打開錯誤。 – Alvin

+0

限制你的線程。使用線程池。 – Drona