【问题标题】:java thread multithreadingjava线程多线程
【发布时间】:2012-11-16 15:06:26
【问题描述】:

在java中,在java中添加多个线程来完成一项任务是否有助于更快地执行该任务?

目前我的程序中使用了主线程,但速度很慢。我目前的测量结果是每秒 500 个进程,但进程总数超过 10 亿。如何让我的程序运行得更快?

【问题讨论】:

  • 当你做蛋糕的时候,100个人一起做会不会更快?
  • 你的主线程在做什么?您需要提供有关已完成工作的更多详细信息。例如,如果您的工作正在读取一个大文件,那么并行化它会使情况变得更糟。
  • 这取决于你的任务做什么——如果它们主要是 CPU 密集型的,那么添加线程会有所帮助。如果瓶颈是从文件中读取数据,则不会。请参阅此经验法则以获得一个想法:stackoverflow.com/a/2193349/829571
  • @Adrian Shum:好一个.. 双向工作。
  • 我正在处理一个文件,正在读写一个文件

标签: java multithreading


【解决方案1】:

在java中,在java中添加多个线程来完成一项任务是否有助于更快地执行该任务?

这完全取决于你在做什么。如果您在独立的数据片段上执行任务,在检索或存储结果方面没有瓶颈,并且假设您在一台具有多个处理器的机器上,那么是的,使用更多线程可能会有所帮助。

但是,它有多种方式不能提供帮助:

  • 如果您从慢速资源中读取输入数据,您可能会尽可能快地处理它
  • 如果您将结果写入慢速资源,您可能会以尽可能快的速度处理它
  • 如果一项任务依赖于另一项任务的结果,您可能无法获得任何并行化
  • 如果您只有一个 CPU 内核,并且任务已经受 CPU 限制,那么添加更多线程将无济于事

在某些情况下,线程可以帮助,但不如它只是 CPU 绑定那么重要,并且您有大量备用内核。你需要弄清楚你当前的瓶颈在哪里。

请注意,在 最佳 情况下,您只会获得与您拥有的核心数量成比例的加速。因此,如果你有 16 个核心(不太可能但可行)并且完美的并行化,那么如果一个核心每秒可以处理 500 个项目,而你有 10 亿个项目,那么处理所有内容仍然需要将近 35 个小时。

几乎确定的一件事是你的多线程代码将比你的单线程代码更复杂。尝试使用高级抽象(例如 java.util.concurrent 中的抽象而不是低级抽象(例如 java.lang.Thread)以使事情变得更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多