线程的基本概念

一、并发与并行:

1、并发(Concurrency):
是指系统在同一时间段可同时处理多个任务,多个任务交替执行,而同一时刻只有一个任务处于运行状态。

2、并行(Parallel):
并行是指同一时刻可以同时运行多个任务。

二、进程与线程:

1、进程(Process):
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,同时也是线程的容器。

2、线程(Thread):
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

一个操作系统拥有多个进程,一个进程拥有至少一个线程。
一个程序拥有一个或多个进程,通常应用为一个进程,但诸如Chrome、Firefox等应用也会拥有多个进程。
一般而言进程之间无法共享资源,因为进程拥有独立的内存空间、资源分配等,多个进程之间互不影响;但线程却天然共享内存空间。
所以多线程应用最大的问题就在于如何规避资源被多个线程同时访问,而多进程应用最大的问题就在于进程间通信。

三、同步与异步:

同步与异步,从概念上来看,其关注的是消息的通信方式。同步强调发出一个调用或一个请求时,必须等待其返回结果,才能够执行下一步操作。而异步强调的是发出请求后直接进行下一步操作,不需要马上关心返回结果。对于程序员而言,这两个概念都是在抽象感知的层面解释的,而在代码层面,其实与多线程或多进程并无干系。比如一个资源服务器,调用接口后直接返回缓存好的图片、文本等,资源都是只读的(在网络图床、内容发布系统中应用广泛),通常服务都是并发提供的,即开启了多进程/多线程,然而服务本身却是同步的,因为调用了接口就要等待资源返回;而异步则通常依靠函数回调、事件轮询等机制实现。典型的比如NodeJS,其机制就是单线程异步模型,内部依靠事件轮询来实现异步。

事件轮询可以理解为,在主线程中执行完了相应的事件注册后,则开始执行一个死循环,也就是轮询,用来监听所有注册的事件是否被触发。触发的方式很简单,通过触发的线程来操作共享的标识资源,当轮询检测到标识为触发状态,则开始调用相应的事件函数。执行完毕后,继续循环。其实NodeJS本身实现也是依靠了多线程,只是提供给程序员感知的就只有一个单线程而已。其内核为Chrome浏览器的V8引擎,其实浏览器执行Javascript也是这样的,编写的代码执行起来一定是单线程,但浏览器内置了轮询线程、事件监听线程等等。事件轮询模型非常适合界面程序,使用较少的线程/进程资源且能够保持程序的高效运行。

也有其他很多的各种模型,比如同步阻塞(典型的Java的I/O流)、同步非阻塞、异步阻塞、异步非阻塞,其实现方式也多种多样,在此不再进行深入探讨。

四、线程同步(synchronized):

线程内在代码执行进入synchronized(同步方法、同步代码块、同步锁,也就是三种同步的操作),便可获得锁对象(同步方法静态的话为所在类的字节码文件、非静态为this,而同步代码块可自定义锁对象)。
此后,只有同步内的代码被完全执行完毕,才可释放锁对象。那么如果,多段同步共用一个锁对象,则将不会在同步内的中途交叉执行代码,从而互相保证线程安全,并产生交替阻塞。

五、线程的六种状态 :

  1. 新建状态(New)

重写或实现了runnable方法且并未调用start方法,也就是:新建且尚未启动的线程处于此状态。

  1. 可运行状态(Runnable)

在Java虚拟机中执行的线程处于此状态。此状态说明了线程已经获得cpu的执行权力,但包含两种执行状态:
_1、Ready:线程可执行,但当前cpu被其他正在执行的线程占用,而处于等待中。
_2、Running:线程可执行,且正在cpu中处于执行状态。

  1. 阻塞状态(Blocked)

线程因与其他线程共用同一个锁对象,而该锁对象被其他线程所持有(其他线程的同步内的代码尚未执行完成),从而无法进入synchronized中的状态。

  1. 限时等待状态(Timed_waiting)

线程因调用sleep方法处于休眠状态中,规定时间后可醒来,回到可运行状态(Runnable)。

  1. 无限等待状态(Waiting)

_1、进入无限等待状态:
(1) 线程拥有锁对象
(2) 线程调用wait方法
(3) 线程自动释放锁对象
_2、退出无限等待状态:
(1)其他线程拥有本线程释放的同一个锁对象
(2)其他线程调用notify方法
完成以上两步,则处于无限等待的线程回到了阻塞状态(Blocked),这是因为其锁对象正被其他线程持有,自己并未获得。
(3)·被唤醒的线程再次持有锁对象,回到可运行状态(Runnable)。
以上步骤为等待唤醒机制的基础。

  1. 消亡状态(Terminated)

已退出的线程处于此状态。一般为线程内任务执行完毕、或调用已过时的stop方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值