【问题标题】:create multiple java threads in a while loop depending on the number of inputs根据输入的数量在while循环中创建多个java线程
【发布时间】:2012-09-30 18:30:33
【问题描述】:

我正在尝试编写一个从数据库中读取信息并为表的每一行创建一个新线程的 java 程序。所以我不知道我需要多少线程。到目前为止我有这个:

        con = DriverManager.getConnection(url, user, passwd);
        pst = con.prepareStatement("select hostname, ipadress, vncpassword from infoscreens");
        rs = pst.executeQuery();
        int i=0;
        while (rs.next()) {
            i++;
            Thread tread[i]  = new Savescreenshots(rs.getString(1),rs.getString(3),rs.getString(2));
            tread[i].start();
        }

但问题是这不起作用。我需要为表中的每一行创建一个新线程。任何人都知道如何做到这一点

感谢和问候

【问题讨论】:

  • 您应该提供更多详细信息,例如:什么不起作用?此外,您应该考虑使用线程池,因为您将有很多 db 条目。
  • 什么不起作用。你能指出来吗?

标签: java mysql multithreading loops


【解决方案1】:

您需要一个动态增长的容器来容纳一组未知大小 - List,例如:

List<Thread> threads = new ArrayList<Thread>();
while (rs.next()) {
    Thread tread  = new Savescreenshots(rs.getString(1),rs.getString(3),rs.getString(2));
    tread.start();
    threads.add(thread);
}

此时,您的程序创建和启动的所有Thread 对象都是threads 列表的元素。您可以枚举它们并执行您计划对它们执行的任何其他操作(例如,等待它们完成):

for (Thread thread : threads) {
    thread.join();
}

【讨论】:

  • 不是绝对必要的。 OP 可能根本不需要保留对线程的引用。
【解决方案2】:

您的想法听起来很疯狂,但您可以做的是使用 Java 中的 SQL 功能,找出您当前有多少行,然后使用该数字来创建您的线程。

【讨论】:

  • 每个线程的构造函数需要的数据呢?或者你是说先创建一个线程池然后...?
  • 没有再进一步,因为这个想法很可笑。为什么要为数据库中的每一行创建一个线程?如果要读取的行太多,您将很快耗尽内存。
  • 什么?这些是要求。没有地方说行数会很大?如果应用程序不能同时提供给 N 个以上的客户怎么办。如果业务需求需要应用程序必须等到几个线程空闲?
  • "我正在尝试编写一个 java 程序,它从数据库中读取信息并为表的每一行创建一个新线程。"对于表格的每一行,都会创建一个新线程。我认为他根本不会重用线程,更像是一直阅读它们并在创建新条目时继续阅读。如果他使用 ExecutorService,也许他可以一次读取一些行,但他的描述似乎不只是读取几行,而是一直读取整个内容。
  • 看看他在读什么:主机名、ipadress、vncpassword。也许永远不会有太多行。也许他正在与每个线程上的 VNC 主机建立连接。在那种情况下,我认为数据库中不应该有太多行。我觉得我用的可能太多了。
【解决方案3】:

尝试只使用简单的变量say t 而不是数组tread[i]。

此外,如果行数很大,为每一行创建一个新线程可能会填满内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2022-01-16
    • 1970-01-01
    • 2012-03-28
    • 2022-01-04
    • 2019-03-03
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多