太多的开放线程错误

时间:2012-05-16 09:18:41

标签: java multithreading io

我正在使用Open Directory Project(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 / file-max

有没有办法限制可以同时启动的线程数?我认为它是由可以运行CPU的线程数自动完成的。

谢谢!

编辑:这是main方法中的主循环:

        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();

2 个答案:

答案 0 :(得分:3)

在整个问题中,您似乎对线程文件感到困惑。

大多数操作系统都限制了给定进程可以打开的文件描述符的数量。这包括文件系统上的实际文件,通常还包括数据库或服务器连接等套接字。 (这与您的流程中运行的线程数没有任何关系。)

如果您当前持有最大数量的打开文件句柄,则您的进程将无法再打开。这通常是资源泄漏的迹象 - 即您没有正确关闭I / O资源。 非常很少,如果您的应用程序需要同时从数万个文件中读取,您是否需要增加操作系统限制。

ODP.run方法中,您是在循环中创建FileWriters,还是未能在其上调用close()

答案 1 :(得分:0)

  

有没有办法限制可以启动的线程数   同时?

是的,通过使用某种线程池。如果您使用的是Java 1.5及更高版本,那么您很幸运;您可以使用ThreadPoolExecutor来限制并发线程的数量。