【问题标题】:Starting multiple thread at the same time同时启动多个线程
【发布时间】:2023-03-06 02:18:01
【问题描述】:

我一直在尝试编写一些 java 应用程序。 这个应用程序想要运行的是处理一个文本文件。

但是,输入文本文件很大,(超过 200mb) 我尝试将 200mb 拆分为四个拆分文件(每个 50mb)

然后,使用四个线程,尝试同时处理每个拆分。

所以,我创建了一个实现可运行的类,它有一个文本处理模块。 然后,我创建了 4 个 obj(名为 worker1 ~ worker4)runnnable 类,然后调用:

worker1.run();
worker2.run();
worker3.run();
worker4.run();

但是,这些线程不是同时运行的,而是线性运行的。 这意味着,worker 1 线程完成后,worker2 线程正在运行。

因此,它们每个只需要 0.5 秒,但在这种线性运行中,每个需要 2 秒。 (worker1 0.5s + worker2 0.5s + worker3 0.5s + worker4 0.5s) 如果我可以同时运行 4 个线程,我预计这个应用程序只需要大约 0.5 秒或不到 1 秒,这比 2 秒快。

我该怎么做?

【问题讨论】:

  • 请记住,在这种情况下,很可能在多个线程中处理文件的性能会更差,而不是更好。
  • 200MB 不是一个大文件。您可以在一两秒钟内阅读它。是什么让您认为多线程会更快?你有多线程磁盘吗?
  • 200 mb 实际上并不大。但是,就我而言,处理需要将近 20 秒。但是,我拆分了 4 个工人,然后处理它。这需要 4.33 秒来处理。多个但处理不同部分的输入非常快!

标签: java multithreading concurrency


【解决方案1】:

您需要启动一个线程。所以:

new Thread(worker1).start();
new Thread(worker2).start();
new Thread(worker3).start();
new Thread(worker4).start();

【讨论】:

  • 是的,所有线程将同时开始工作。调用 run() 方法不会启动线程,而是将其视为该类的方法。所以要启动一个线程总是在线程上调用 start()。
【解决方案2】:

Runnable 对象不是 Thread,需要使用 Thread 来运行 Runnable Object,如下所示:

new Thread(worker1).start();

但我认为您可能会遇到其他问题,所以请阅读 java 文档。

【讨论】:

    【解决方案3】:

    在一个磁盘上读取文件通常不会从多线程中受益。

    尝试改进您阅读和处理文件的方式。如果您尚未使用缓冲区,请使用 BufferedReader。

    如果您对读取的内容进行大量处理,请考虑多线程处理,同时保持一个线程专用于读取。

    要运行并发任务,您应该使用ExecutorService,感谢Executors。花点时间阅读 javadoc。

    【讨论】:

      【解决方案4】:
      worker1.run();
      

      直接调用你的 run 方法。要启动一个线程(在新线程中调用您的 run 方法),请使用:

      worker1.start();
      

      (worker2/3/4 类似)

      编辑:我认为工作人员是线程,而不是 Runnables。 mvieghofer 的回答是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-02
        • 2016-02-02
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多