JAVA多线程与多进程

并发与并行是两个既相似而又不相同的概念,但往往容易混为一谈,这两者究竟有什么区别呢?本文通过一个例子让你更好地理解(本文由并发编程网翻译)。

现代社会是并行的:多核、网络、云计算、用户负载,并发技术对此有用。

Go语言支持并发,它提供了:并发执行(goroutines),同步和消息(channels)和多路并发控制(select)。

并发和并行的区别

当Go声称是并发时,人们说:“并发很酷!耶,我可以并行运行了!”,但这是个错误的。因为很多人都不了解他们间的差别。“我用四个处理器来做质数筛选,但是更慢了。”

  • 并发(Concurrency):以可独立执行的进程集合的方式编程(进程是出了名的难定义,这里是通常意义上的进程,不是Linux进程)
  • 并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。

两者的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。不同,但也相关。一个是关于代码结构,一个是关于代码执行。并发为可能的(不是必须的)并行问题提供了一种解决方案。比如:

  • 鼠标、键盘、显示器、磁盘驱动是并发结构的。
  • 向量点积是并行的。

并发带有通信

并发是一种构造程序的方式,把任务分解为一个个独立运行的小任务。通信是协调这些小任务的手段。

Go
的模型(还有Erlang等)都是基于CPS(Communicating sequential processes,通信顺序进程):其论文C.
A. R. Hoare: Communicating Sequential Processes (CACM 1978)

通过一个例子来理解

以上讲得太抽象了,我们举实际点的例子。

我们的问题:把一堆废弃语言的说明书运到火炉里,一只地鼠会花费很长时间。

更多的地鼠

单单更多的地鼠也不解决问题,它们需要更多的推车。

更多的地鼠、更多的推车

这样会加快速度,但它们会在那堆书和炉子那边遇上瓶颈。同时也要同步两只地鼠,可以通过消息的方式实现。

全部加倍

这样会以两倍的速度运送。这是两个地鼠程序的并发构成(concurrent composition)。

但这种设计不是自发并行的,如果一次只有一只地鼠在运会怎样?

这种设计仍是并发,不是并行。[译者注:一只地鼠运一次上面那堆书,然后第二只地鼠再运一次下面那堆书。一次只允许一只地鼠运送,这样就不是并行的。]

然而,这种场景是可以自发并行的。并发构成可以考虑下其他模型。

另一种设计

三只地鼠在工作,但可能会有延误。每只地鼠是个独立的步骤,附加协调(通信)。

更细粒度的并发

增加一只地鼠用来运回空推车。四只地鼠在工作,运行得更加流畅,每只地鼠都在做一个简单的任务。

如果我们把事情安排的足够好(现实中很难但不是不可能),速度会是最先只有一只地鼠的那个设计的四倍。

观察结论:我们在一个已有的设计(指三个地鼠的那个设计)中添加一个并发的步骤(第四只地鼠)增强了系统的性能。更多的地鼠干了更多的活,系统运行得更好。并发比简单的并行对问题要有更深的洞察。

我们有四个并发的步骤:1.装书到推车上2.把推车运到火炉边3.把书卸到火炉里4.运回空推车

不同的并发设计能以不同的方式来并行。

更多的并行

我们以另一个维度来并行,并行使这样的设计变的容易。八只地鼠,都在繁忙工作。

但也可能根本没有并行

谨记:即使一次只能有一只地鼠在工作(零并行),这也不失为一个良好的并发的解决方案。

另一种设计

下面也是一种用并发组成来解决问题的设计。两只地鼠,再加上一个中转堆。

以一般的方式来并行

用更多的并发程序来提高吞吐量

或者一种不同的方式

在多地鼠并发模型中引入中转堆

全面优化

使用我们所有的技术,16只地鼠都开足马力。

学到内容

我们有很多方法把问题分解,这才是并发设计。一旦我们分解了问题,并行就自然而然的产生了,正确性也变得很容易。

回到计算

我们关于运书的问题,可以看做是如下的类比:书堆是Web数据,地鼠是CPU,推车是调度、渲染或是网络,火堆是代理、浏览器或是其他的消费者。地鼠提供网络数据,这就是一个可扩展的Web服务的并发设计了。

时间: 2024-10-10 15:35:51

JAVA多线程与多进程的相关文章

编程思想之多线程与多进程(2)——Java中的多线程

原文:http://blog.csdn.net/luoweifu/article/details/46673975 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java中多线程程序的开发 单线程 任何程序至少有一个线程,即使你没有主动地创建线程,程序从一开始执行就有一个默认的线程,被称为主线程,只有一个线程的程序称为单线程程序.如下面

【转】编程思想之多线程与多进程(3)——Java中的多线程

<编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下Java中多线程程序的开发 单线程 任何程序至少有一个线程,即使你没有主动地创建线程,程序从一开始执行就有一个默认的线程,被称为主线程,只有一个线程的程序称为单线程程序.如下面这一简单的代码,没有显示地创建一个线程,程序从main开始执行,main本身就是一个线程(主线程),单个线程从头执行到尾. [Demo1]:单线程程序 pu

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程

多线程和多进程的区别: 本质的区别在于每隔进程拥有自己的一整套变量,而线程则共享数据.在有些操作系统中,与进程相比较,线程更轻量级,创建,撤销一个线程比启动新进程的开销要小的多.\ 简单的来说:一个进程至少有一个线程,线程是进程的组成部分,线程结束,进程不一定结束,进程结束,线程一定结束. 为什么要使用线程? 使用线程是为了给其他任务提供运行的机会.在普通的程序中,只能顺序执行每一个任务,使用线程可以在一个任务未完成时执行其他的任务, 如何实现线程? [1].继承Thread类或者实现Runna

第12篇-JAVA 多线程

第12篇-JAVA 多线程 每篇一句 :不要只看到艰难,要看艰难后面的胜利 初学心得: 敢于尝试,就等于你已经向成功迈出了第一步 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-20| JAVA 多线程 ] 1.进程与线程 1.什么是进程 程序是指令和数据的有序的集合,其本身没有任何运行的含义,是一个静态的概念 进程是一个具有一定独立功能的程序,一个实体 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程 当一个程序运行时,内部可

Java多线程学习

写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线

java多线程学习(1)

1)多线程与多进程的区别 多线程和多进程有什么区别呢?本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据. 对程序来说,共享的变量会使得线程之间的通信比进程间的通信更加有效和简单:同时,线程相对于进程来说,更加的“轻量级”, 线程的创建和销毁要比 进程的 开销要小的多. 2)多线程程序的构造 多线程的构造通常有两种方法, 第一种方法是,构建一个Thread的子类,并重写它的run()方法: 1 class MyThread extends Thread 2 { 3 4 publi

Java多线程学习(吐血超具体总结)

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文仅仅能说是java多线程的一个入门.事实上Java里头线程全然能够写一本书了,可是假设最基本的你都学掌握好,又怎么能更上一个台阶呢?假设你认为此文非常简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 文件夹(?)[-] 一扩展ja