2012-05-16 48 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