线程,是程序执行的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。以上概念来自于百度百科。对于开发者来说,线程就是帮我们干实事的伙伴。在Java中,对于线程的基本操作,我们知道在代码中有以下三种写法:

(1)自定义一个类,去继承Thread类,重写run方法

(2)自定义一个类,去实现Runnable接口,重写run方法

(3)自定义一个类,实现Callable接口,重写call方法。关于这个Callable,要多提一嘴,首先,Callable规定的方法是call(),而Runnable规定的方法是run().;其次,Callable的任务执行后可返回值,而Runnable的任务是不能返回值的;然后,call()方法可抛出异常,而run()方法是不能抛出异常的;最后,运行Callable任务可拿到一个Future对象。

 

 
 
实现Callable接口

因为线程的基本概念和使用大家基本上都很熟悉,所以这里就点到为止。

关于线程,就不得不提及另外一个经常容易被混淆的概念,那就是并行和并发。

关于并行和并发,我在网上找了一段关于并行和并发的英文资料:

Concurrency is when two tasks can start, run, and complete in overlapping time periods. Parallelism is when tasks literally run at the same time, eg. on a multi-core processor.

Concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations.

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

An application can be concurrent – but not parallel, which means that it processes more than one task at the same time, but no two tasks are executing at same time instant.

An application can be parallel – but not concurrent, which means that it processes multiple sub-tasks of a task in multi-core CPU at same time.

An application can be neither parallel – nor concurrent, which means that it processes all tasks one at a time, sequentially.

An application can be both parallel – and concurrent, which means that it processes multiple tasks concurrently in multi-core CPU at same time.

 

翻译过来就是:

并发是两个任务可以在重叠的时间段内启动,运行和完成。

并行是任务在同一时间运行,例如,在多核处理器上。

并发是独立执行过程的组合,而并行是同时执行(可能相关的)计算。

并发是一次处理很多事情,并行是同时做很多事情。

应用程序可以是并发的,但不是并行的,这意味着它可以同时处理多个任务,但是没有两个任务在同一时刻执行。

应用程序可以是并行的,但不是并发的,这意味着它同时处理多核CPU中的任务的多个子任务。

一个应用程序可以即不是并行的,也不是并发的,这意味着它一次一个地处理所有任务。

应用程序可以即是并行的也是并发的,这意味着它同时在多核CPU中同时处理多个任务。

    看完了这些,可能还是懵懵懂懂。为了彻底理清并行和并发的概念,我找了两幅不错的资料图来帮助我们巩固理解区分并行和并发。

首先是并发:

 
 
并发(  Concurrency )

    Concurrency,是并发的意思。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。

    从微观角度来讲:所有的并发处理都有排队等候,唤醒,执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。

    从宏观角度来讲:多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理。

    通俗点讲,并发就是只有一个CPU资源,程序(或线程)之间要竞争得到执行机会。图中的第一个阶段,在A执行的过程中B,C不会执行,因为这段时间内这个CPU资源被A竞争到了,同理,第二个阶段只有B在执行,第三个阶段只有C在执行。其实,并发过程中,A,B,C并不是同时在进行的(微观角度)。但又是同时进行的(宏观角度)。

    简单说完了并发,我们继续分析并行:

 

 
 
并行(Parallelism)

    Parallelism,翻译过来即并行,指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源上(多核),同时执行。

    并行,不存在像并发那样竞争,等待的概念。

    图中,A,B,C都在同时运行(微观,宏观)。

    关于并行和并发的基本概念大概介绍到这里,如果还觉得不是很好理解,请自行谷歌或者百度查阅资料慢慢消化。

上面简单回顾了下线程、并行和并发的基本概念,下面我们在说说多线程。

    首先,什么是多线程?

    我们知道,一个任务就是一个线程 ,但实际上,一个应用程序为了同时执行多个任务提供运行效率,一般会涉及到一个线程以上的数量。如果,一个应用程序有一个以上的线程,我们把这种情况就称之为多线程。

    本质来说,多线程是为了使得多个线程完成多项任务,以提高系统的效率。目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源(本质是为了让效率最大化)。所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一个任务。但是,这样就会出现一些问题,对小系统来说这样做很好。但是当系统越来越复杂时,线程的数量也会越来越多,操作系统将会花费更多时间去理清线程之间的关系。为了让我们的程序具备可扩展性,我们将不得不对线程进行一些有效的控制。

    针对这种情况,开发者通过使用线程池就可以有效规避上述风险。




posted on 2019-07-22 21:47  牛逼哥  阅读(182)  评论(0编辑  收藏  举报