【问题标题】:When should you use multithreading? And would multi threading be beneficial if the different threads execute mutually independent tasks?什么时候应该使用多线程?如果不同的线程执行相互独立的任务,多线程是否有益?
【发布时间】:2011-11-17 04:34:25
【问题描述】:

这是我在昨晚被拒绝的面试中唯一无法回答的两个问题。

【问题讨论】:

  • 我猜mt在任务独立时会是有益的,否则不可避免的顺序执行。

标签: java multithreading


【解决方案1】:

问:什么时候应该使用多线程?

A:“你的问题非常广泛。很少有非平凡的系统可以通过一个线程简单、快速、可靠地满足功能。例如:[挑选出目标公司销售的典型系统和选择其功能的几个方面,这些方面会更好地线程化 - 繁重的 CPU、通信、多用户 - 只需选择可能的东西并解释]。

问:如果不同的线程执行相互独立的任务,多线程会有好处吗?

答:“取决于你所说的‘执行任务’的意思。如果线程以并发方式处理相互独立的数据,多线程肯定是有益的——它减少了对锁的需求,并且死锁的概率以超线性方式增加锁的数量。OTOH,线程执行相同的代码没有问题,这是安全且非常常见的。”

【讨论】:

  • 有哪些“重 CPU”的例子?
【解决方案2】:

当您想要执行繁重的操作而不“阻塞”流程时,您应该使用多线程。
在后台线程中进行大量处理但 UI 仍处于活动状态的 UI 示例。

如果线程执行互斥任务,这是最好的,因为不需要线程之间的同步开销

【讨论】:

  • 我会说,受 CPU 限制的互斥任务。因为 IO 绑定的互斥任务 将再次像开销一样。
【解决方案3】:

多线程是一种在程序中引入并行性的方法。无论如何,如果您的程序中可以存在并行路径(不依赖于其他部分结果的部分),则可以使用它。

特别是现在所有这些多核机器,这是一个应该利用的功能。

一些示例是 处理大数据,您可以将其分成块并在多个线程中完成,文件处理,长时间运行的 I/O 工作方式类似于网络数据传输等

对于你的第二个问题,最好是任务相互独立 - 原因

  • 没有共享数据意味着没有争用
  • 不需要任何有序的处理(依赖),所以每个线程在有资源的情况下都可以工作
  • 更易于实施

【讨论】:

    【解决方案4】:

    当您从主事件循环调用耗时的任务时,您绝对应该在 GUI 应用程序中使用多线程。这同样适用于在执行 I/O 时可能会阻塞的服务器应用程序。

    对于第二个问题,当您的机器具有多个 CPU 内核时通常是肯定的。在这种情况下,这些独立的任务可以并行执行。

    【讨论】:

      【解决方案5】:

      如果可以并行执行的任务可以分解,则可以使用多线程。比如生产和消费、验证和保存、读取和验证。

      对于第二个问题,是的,如果它们执行独立的任务,那么将程序变成多线程是有好处的。

      【讨论】:

        【解决方案6】:

        这篇文章给出了很好的理由: https://marcja.wordpress.com/2007/04/06/four-reasons-to-use-multithreading/

        总而言之,原因是:

        • 让您的程序保持响应。
        • 更好地利用您的 CPU。 CPU可能被IO或其他东西阻塞。等待的时候,为什么不让其他线程使用呢
        • 可以将多个线程调度到多个 CPU 内核
        • 有些问题自然要通过多线程来解决。这样的解决方案可以简化您的代码。

        【讨论】:

          【解决方案7】:

          通常,多线程用于执行时间受到CPU限制/瓶颈的情况,而不是其他领域(例如 IO)。第二个问题真的很主观。例如,如果它们相互独立,但都做大量的 IO,那么您可能不一定会获得很大的收益。

          【讨论】:

          • 视情况而定。在单核 CPU 上,如果 CPU 时间是瓶颈,线程实际上会减慢您的速度(因为 CPU 和操作系统必须花时间在线程之间切换)。只有当您的工作涉及等待零星和/或缓慢的事情(无论是 GUI 事件、键盘输入等)并且希望在这些工作等待时发生其他事情时,线程才会大获全胜。
          • 你是对的。我假设有多个物理内核。
          • 我实际上认为 CPU 密集型的东西不适合多线程,除非您运行的线程数与物理 CPU 内核的数量完全相同。然而,这是一个概括。
          【解决方案8】:

          当我们可以将工作分成几个独立的部分时,就会使用多线程。例如,假设您必须执行一个复杂的数据库查询来获取数据,并且如果您可以将该查询分成几个独立的查询,那么最好为每个查询分配一个线程并并行运行。 这样,您的最终结果输出会更快。 同样,这是您可以运行多个数据库查询的示例。

          为了回答你的第二个问题,最好有独立任务的线程。否则,您将不得不处理同步、全局变量等问题。

          【讨论】:

            【解决方案9】:

            什么时候应该使用多线程?

            多线程是同时执行多个线程的过程。当您可以同时执行多个操作时,您应该使用多线程,这样可以节省时间。

            如果不同的线程执行相互独立的任务,多线程会有好处吗?

            通常是的。如果不同的线程执行相互独立的任务,多线程通常是有益的,这样如果单个线程中发生异常,它不会影响其他线程。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-24
              • 2013-09-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多