并发指的是两个任务在不同线程上同时运行。而异步方法在同一个线程上并行运行。这是如何实现的?并行又是什么呢?
这3个概念有什么区别?
并发指的是两个任务在不同线程上同时运行。而异步方法在同一个线程上并行运行。这是如何实现的?并行又是什么呢?
这3个概念有什么区别?
"并发"和"并行"原则实际上是相同的,正如您正确推测的那样,两者都涉及任务同时执行,但我认为"并行"任务应该是真正的多任务,即在「同一时间」执行,而"并发"可能意味着这些任务共享执行线程,但仍然看起来是在并行执行。
"异步方法"与前面两个概念没有直接关系,异步性用于呈现并发或并行任务的印象,但实际上,异步方法调用通常用于需要远离当前应用程序进行工作的进程,我们不希望等待并阻塞应用程序等待响应。
例如,从数据库获取数据可能需要时间,但我们不希望阻塞用户界面等待数据。异步调用使用回调引用,并在请求已经传递给远程系统后立即将执行返回到您的代码。您的用户界面可以继续响应用户,而远程系统则可以执行所需的任何处理。一旦它返回数据到回调方法,那么该方法就可以根据需要更新用户界面(或交付该更新)。
从用户的角度来看,它看起来像是多任务处理,但实际上可能不是。
编辑:
值得注意的是,在许多实现中,异步方法调用将导致线程启动,但这并非必要,这实际上取决于正在执行的操作以及响应如何通知回系统。
并发可以在以下几种情况下发生:
异步 — 这意味着您的程序执行非阻塞操作。例如,它可以通过HTTP启动对远程资源的请求,然后继续执行其他任务,同时等待接收到响应。这有点像发送电子邮件后,在等待响应时继续自己的生活。
并行 — 这意味着您的程序利用多核计算机的硬件,通过将工作分解为任务,并在不同的核心上执行每个任务,来同时执行任务。这有点像在淋浴时唱歌:您实际上正在完全相同的时间内做两件事。
多线程 — 这是一种软件实现,允许不同的线程同时执行。即使在单核计算机上运行,多线程程序看起来也像在同时进行几件事情。这有点像通过不同的即时通讯窗口与不同的人聊天;虽然您实际上在不断地切换,但最终结果是您在同时进行多个对话。
每个人都很难将异步与并行或并发关联起来,因为异步不是并行或并发的反义词,它是同步的反义词。这只是指如果某些东西(在本例中是线程)将与其他东西(在本例中是另一个线程)同步。
我会简洁有趣地介绍这些概念。
并发 vs. 并行 - 任务执行的方式。
举个现实生活中的例子:有一个挑战要求你既要吃完一整个大蛋糕,又要唱一首完整的歌曲。如果你是最快的完成了唱歌和吃蛋糕,你就能赢得比赛。所以规则是你要同时(concurrently)唱歌和吃蛋糕。具体怎么做不属于规则范畴。你可以先把整个蛋糕吃掉再唱整首歌,或者你可以先吃半个蛋糕再唱半首歌,然后重复上述步骤,等等。
并行是并发的一种特殊形式,其中任务真正同时执行。在计算机科学中,只有在多核环境下才能实现并行。
同步 vs. 异步 - 编程模型。
在同步(synchronous)中,你编写的代码是按照从上到下的顺序依次执行的步骤。在异步编程模型中,你编写的代码是作为任务被执行的,并行执行这些任务。并发执行意味着所有任务可能同时执行。
并发性意味着应用程序同时(并行)处理多个任务。如果计算机只有一个CPU,则该应用程序可能无法确切地同时处理多个任务,但是应用程序内部会同时处理多个任务。在开始下一个任务之前,它不会完全完成一个任务。
并行性意味着应用程序将其任务分成较小的子任务,可以在多个CPU上同时处理。
如您所见,并发性与应用程序处理多个任务的方式有关。应用程序可以按顺序处理一个任务(串行),也可以同时处理多个任务(并行)。
另一方面,并行性与应用程序处理每个单独任务的方式有关。应用程序可以从头到尾按顺序处理任务,也可以将任务拆分为子任务,这些子任务可以并行完成。
如您所见,应用程序可以是并发的,但不是并行的。这意味着它可以同时处理多个任务,但任务没有被拆分为子任务。
应用程序也可以是并行的,但不是并发的。这意味着应用程序一次只能处理一个任务,并且此任务被拆分为可并行处理的子任务。
此外,应用程序既不并发也不并行。这意味着它一次只能处理一个任务,并且该任务永远不会被拆分为可并行执行的子任务。
最后,应用程序可以同时具有并发性和并行性,即它同时处理多个任务,并将每个任务拆分为可并行执行的子任务。但是,在这种情况下,可能会失去并发性和并行性的某些优势,因为计算机中的CPU已经通过并发性或并行性保持相当繁忙。组合可能只导致小的性能提升甚至性能下降。在盲目采用并发并行模型之前,请务必进行分析和测量。
摘自http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html