java并发-----基础篇(一)
一、基础概念
1.cpu核心数和线程数的关系
-
cpu核数
逻辑上单个cpu能模拟出的cpu核心数即cpu个数
-
线程数
线程数=cpu个数*核数
2.cpu时间片轮转机制
当启动多个应用程序(即多个进程)cpu会给某一个进程分配一个时间片来运行当前进程,当时间片用完,就会保存当前该进程的执行进度,当该进程再次获得cpu分配的时间片的时候,就会从保存的进度继续执行,上一个进程进度保存后,cpu会给另一个进程分配时间片,并执行,也就是常说的上下文切换。
3.什么是进程和线程
-
进程
资源分配的最小单位
一个.exe应用程序就可看作一个进程
-
线程
cpu调度的最小单位,共享进程中的资源,依附于某一个进程存在
4.澄清并行和并发
-
并行
拿高速公路来说,并行就是同时运行的数量,一条八车道的高速公路可供八辆车同时同行
-
并发
并发与时间紧密相连,还拿八车道的高速公路举例,一秒可同时通过八辆车,一分钟可通过480辆车,那么该高速公路60秒的并发量是480.
5.高并发编程的意义和注意事项
1.意义
- 充分利用cpu的资源
- 加快用户响应的时间
- 模块化、异步化
2.注意事项
- 线程的安全性
6.java新建线程的三种方式
- 继承Thread类
- 实现runnable接口
- 实现callable接口(有返回值的runnable接口)
7.结束线程
-
stop() 不建议使用
-
suspend() 不建议使用,使该线程进入睡眠状态,但不释放线程资源
-
interrupt() 本质上是把线程的中断标志位设为true,并不会中断线程
isinterrupt() 和static的interrupted() 会检查线程的中断为是否为true,并中断线程
8.线程的五种状态
-
阻塞有三种方式
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
参考《线程的生命周期及五种基本状态》https://blog.csdn.net/houbin0912/article/details/77969563
9.线程优先级
优先级高的优先执行 setPriority();
10.守护线程
守护线程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。如:java的垃圾回收机制。
当所有非守护线程执行结束后,守护线程自动终止。
设置为守护线程:setDaemon(true);此方法要用在start()方法之前。
参考《守护线程与普通线程》https://www.cnblogs.com/baizhanshi/p/8289202.html