【发布时间】:2011-11-17 04:34:25
【问题描述】:
这是我在昨晚被拒绝的面试中唯一无法回答的两个问题。
【问题讨论】:
-
我猜mt在任务独立时会是最有益的,否则不可避免的顺序执行。
标签: java multithreading
这是我在昨晚被拒绝的面试中唯一无法回答的两个问题。
【问题讨论】:
标签: java multithreading
问:什么时候应该使用多线程?
A:“你的问题非常广泛。很少有非平凡的系统可以通过一个线程简单、快速、可靠地满足功能。例如:[挑选出目标公司销售的典型系统和选择其功能的几个方面,这些方面会更好地线程化 - 繁重的 CPU、通信、多用户 - 只需选择可能的东西并解释]。
问:如果不同的线程执行相互独立的任务,多线程会有好处吗?
答:“取决于你所说的‘执行任务’的意思。如果线程以并发方式处理相互独立的数据,多线程肯定是有益的——它减少了对锁的需求,并且死锁的概率以超线性方式增加锁的数量。OTOH,线程执行相同的代码没有问题,这是安全且非常常见的。”
【讨论】:
当您想要执行繁重的操作而不“阻塞”流程时,您应该使用多线程。
在后台线程中进行大量处理但 UI 仍处于活动状态的 UI 示例。
如果线程执行互斥任务,这是最好的,因为不需要线程之间的同步开销
【讨论】:
多线程是一种在程序中引入并行性的方法。无论如何,如果您的程序中可以存在并行路径(不依赖于其他部分结果的部分),则可以使用它。
特别是现在所有这些多核机器,这是一个应该利用的功能。
一些示例是 处理大数据,您可以将其分成块并在多个线程中完成,文件处理,长时间运行的 I/O 工作方式类似于网络数据传输等
对于你的第二个问题,最好是任务相互独立 - 原因
【讨论】:
当您从主事件循环调用耗时的任务时,您绝对应该在 GUI 应用程序中使用多线程。这同样适用于在执行 I/O 时可能会阻塞的服务器应用程序。
对于第二个问题,当您的机器具有多个 CPU 内核时通常是肯定的。在这种情况下,这些独立的任务可以并行执行。
【讨论】:
如果可以并行执行的任务可以分解,则可以使用多线程。比如生产和消费、验证和保存、读取和验证。
对于第二个问题,是的,如果它们执行独立的任务,那么将程序变成多线程是有好处的。
【讨论】:
这篇文章给出了很好的理由: https://marcja.wordpress.com/2007/04/06/four-reasons-to-use-multithreading/
总而言之,原因是:
【讨论】:
通常,多线程用于执行时间受到CPU限制/瓶颈的情况,而不是其他领域(例如 IO)。第二个问题真的很主观。例如,如果它们相互独立,但都做大量的 IO,那么您可能不一定会获得很大的收益。
【讨论】:
当我们可以将工作分成几个独立的部分时,就会使用多线程。例如,假设您必须执行一个复杂的数据库查询来获取数据,并且如果您可以将该查询分成几个独立的查询,那么最好为每个查询分配一个线程并并行运行。 这样,您的最终结果输出会更快。 同样,这是您可以运行多个数据库查询的示例。
为了回答你的第二个问题,最好有独立任务的线程。否则,您将不得不处理同步、全局变量等问题。
【讨论】:
什么时候应该使用多线程?
多线程是同时执行多个线程的过程。当您可以同时执行多个操作时,您应该使用多线程,这样可以节省时间。
如果不同的线程执行相互独立的任务,多线程会有好处吗?
通常是的。如果不同的线程执行相互独立的任务,多线程通常是有益的,这样如果单个线程中发生异常,它不会影响其他线程。
【讨论】: