关于并发编程,不光是面试经常问到,在实际的操作过程中,也会经常用到。所以一来是为了加深自己的印象,二来也希望能和大家公共学习。不对的地方请斧正,谢谢!
1、程序、进程、线程的关联和区别?
这是个老生常谈的问题了。很多公司的笔试题都会考这个问题,下面来简单分析下
程序:程序是什么,举个例子,你经常玩的吃鸡、LOL就是程序(含有指令与数据的文件)
进程:先说概念,进程就是程序运行资源分配的最小单位。你双击运行程序,就会产生一个进程。
线程:概念:CPU调度的最小单位,存在于进程当中。你运行的游戏中就会有很多个线程,执行不同的工作。音乐、显示等。
运用多线程的好处:充分的利用cpu资源。但是并不是任何时候多线程都比单线程更节约时间。上下文切换也比较耗时。
JDK的线程是协作式,不是抢占式!!!
2、并发和并行?
并发:交替执行不同的任务
并行:同时执行不同的任务
就像告诉公路一样。并发就是单车道,车辆需要排队的跑。并行就是多车道。
这里需要注意一下,谈论并发的时候一定要加上单位时间,否则的话将毫无意义。比如说,单位时间内的并发量是多少。
3、创建线程的几种方式?
这也是个面试官经常问到的问题,两种还是3种?
从代码上看,其实有三种。Thread、Runnbale、Callable。
但是如果从官方文档来讲,就只有两种,
There are two ways to create a new thread of execution.//这句话是Thread.class中73行所写。官方承认只有两种!
其中Thread是对线程的抽象,Runnable是对任务的抽象。并且,Thread类也是实现了Runnable接口。
4、线程的生命周期
新建状态,就绪状态,运行状态,阻塞状态,死亡状态(5种)
线程中断:
在之前的jdk版本中,中断会有stop(),destory()等方法。但是线程不建议使用了,为什么?因为这些方法非常的暴力,调用后不会释放线程所占有的资源!
在当前的JDK版本中,是使用interrupt()方法,但是这里并发强制性的。调用该方法之后,会让线程自己进行中断,而不是调用了马上进行中断,让出资源。
在方法中,也不要使用true或者false来直接判断当前线程是否中断。因为run方法中有阻塞调用时,无法很快的检测到取消标识。线程必须从阻塞调用后才会去检查这个取消标识。
什么是阻塞方法:
1、sleep()方法,支持中断检查
注意:处于死锁的线程无法被中断
join():让当前线程获得CPU的执行权
yeild():让当前线程让出CPU执行权,进入就绪状态。
wait():当前线程等待,并且释放当前对象锁(只有wait会释放当前对应锁)
notify():让一个当前等待的线程变成就绪状态
notifyAll():让所有的线程变成就绪状态
说到wait和notify就不得不说一下,等待通知范式:
什么是等待通知范式,等待(wait),通知(notify)
注意:等待和通知的调用都要放在锁当中调用(都需要先获得锁)
例子:
synchronized(this){
wait();//notify()
}
这里推荐一个比较经典的笔试题:子弹上膛/射击
这里说一下什么是守护线程
守护线程就是:用于后台调度以及支持性功能,GC就是守护线程。