java - 打开的线程错误太多

标签 java multithreading io

我正在使用开放目录项目 (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();

最佳答案

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

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

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

在您的 ODP.run 方法中,您是否在循环中创建了 FileWriters,但未能对其调用 close()

关于java - 打开的线程错误太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615479/

相关文章:

java - Java中读取文件并计算整数之和

java - 使用 TTL 的最佳海量数据持久存储?

java - 实现 JSR-353 (JSON) 的 API 是什么

c# - NetMq 套接字是线程安全的吗?

JAVA将数据存储到outputBuffer数组中,当它满时将其写入文件

c++ - 解析格式化输入时划分单词的问题

java - 需要帮助解决具有一些已知值的最小稀疏线性问题

java - 使用 Java 8 从(嵌套列表)列表列表中获取最大和最小总和的列表

c# - ThreadPool.QueueUserWorkItem 的意外行为

multithreading - 由于模板和线程问题,c++ 11编译失败