线程与进程?
线程是操作系统调度的最小单元,而进程是系统进行资源分配和调度的一个基本单位。
简单理解:进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段
360解释:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
线程状态:
线程从被创建到终止一共有六种状态,分别是初始状态、运行状态、阻塞状态、等待状态、超时等待状态以及终止状态。
如何判读线程处于什么样的状态
当线程被New实例化后,就意味着线程处于了初始状态
当线程调用Thread.start方法后,线程就进入了运行状态,表明线程只要得到系统资源就可以直接运行。其中运行状态分为就绪和运行中,就绪状态指的是线程在等待系统CPU等系统资源,当获得系统资源则真正进入运行状态
- 在就绪状态与运行中状态之间需要系统调度,当线程调用sleep、wait、join等方法时,线程就会进入等待状态或超时等待状态,进入等待状态的线程需要其他线程的通知(notify、notifyAll、unpark)才能返回到可运行状态,而超时状态则时增加了超时后自动返回运行状态的机制。
- 在运行状态中,如果未获取到锁线程就会进入阻塞状态(被阻止在进入synchronized方法),直到获取锁或者被打断才可继续执行程序或者返回
- 当线程执行完Runnable的run方法之后就进入了终止状态
java等待/通知机制
是什么?
Java等待/通知机制指的是一个线程A调用了对象的wait方法进入等待状态,而另外的一个线程B调用对象的notify或者notifyAll方法,线程A感知到这种变化过后从对象的wait方法返回进行后续的代码操作。最终这两个线程的代码执行是建立在这个对象上面进行交互的
有什么用?
实现“做什么”和“怎么做”之间的功能解耦,让程序之间具有良好的可伸缩性。“做什么”由消费者决定,它去通知相应的消费者实现做什么,而消费者接收到通知后去实现怎么做。
等待/通知的经典范式:
等待方(消费者):
//获取锁
synchronized(对象){
//条件满足进行后续操作,完成怎么做
//循环检查条件不满足则继续等待
while(条件不满足){
对象.wait();
}
满足后的代码执行
}
通知方(生产者)
//获取锁
synchronized(对象){
改变条件
对象.notifyAll();
}
创建线程的几种方式
看过下面这篇文章,真的总结得太好了,我着这辣鸡就别去关公面前耍大刀了,附上大佬的链接
http://blog.csdn.net/longshengguoji/article/details/41126119