【问题标题】:Does multithreading cause each task to take longer?多线程会导致每个任务花费更长的时间吗?
【发布时间】:2014-01-31 17:55:16
【问题描述】:

我是多线程的新手...多线程用于提高性能,但是如果处理器已经以尽可能快的速度为单个线程工作,这怎么可能呢?

解释一下:

在单线程环境中,用户 A 启动需要 1 秒的任务 - 任务在 1 秒内完成。 用户 B 在几分之一秒后启动了相同的任务,并且必须等待用户 A,因此用户 B 的任务在将近 2 秒内完成。现在,如果这是一个多线程环境,两个任务不会同时运行,导致两个任务都需要 2 秒? ...例如。完成任务 A 的一部分,然后完成任务 B 的一部分,然后再次完成任务 A 的一部分,然后完成任务 B 的一部分,......直到最终两个任务在大约两秒内完成?

只有多个处理器才会更快吗?还是应该为处理大任务而需要在此期间弹出和退出较小任务时保留多线程?

【问题讨论】:

  • 多任务/多线程最常用于提供良好的 I/O 响应。这适用于具有任意数量内核的系统。

标签: java multithreading performance time task


【解决方案1】:

如果任务是 100% CPU 密集型的,而您只有一个 CPU 内核,那么多线程会使事情变得更慢。如果您有多个 CPU 内核,显然您可以分配与内核一样多的线程来提高性能。如果任务与任何外部(I/O)交互,那么多线程可以将性能提高到一定程度。当一个线程等待 I/O 完成时,其他线程可以执行基于 CPU 的处理。

经典示例是一个进行计算并显示 GUI 的程序。您在一个线程(事件线程)上更新 GUI,并在其他“后台”线程上进行所有处理。事件线程除了处理用户交互之外什么都不做。如果您不这样做,那么当用户请求的操作需要相当长的时间时,GUI 就会停止响应。在这种情况下,您甚至可以在单核系统上运行多线程。

如何调整应用程序对线程的使用取决于很多因素,可能会占用整本教科书。

【讨论】:

    【解决方案2】:

    好的,现在考虑您的任务 A 需要特定资源(例如网络文件或用户输入)来完成其工作。现在假设任务 A 所需的资源当前不可用,那么在单线程环境中接下来发生的事情是任务 A 可以控制 CPU,因此它会等待资源可用,然后此时 CPU 将处于空闲状态,这意味着我们在等待其他资源时正在浪费重要资源,即 CPU 时间。但是如果任务A已经在多线程环境中实现了,当任务A等待资源时,它(任务A线程)会被挂起,直到资源可用,CPU时间可以得到有效利用执行其他任务。希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2020-04-04
      • 1970-01-01
      • 2019-08-24
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2014-04-23
      • 2021-09-01
      相关资源
      最近更新 更多