并发,并行,串行的区别
- 并发:指的同一个时间间隔内发生,交替执行
- 并行:两个任务同一时刻同时执行,互不干扰
- 串行:一个任务接着一个任务执行,只能等前一个执行完毕,下一个才能执行
并发的三大特性
- 原子性: 操作过程中,要么所有操作都执行,要么都不执行
- 可见性: 一个线程对于共享变量值的修改,能够及时的被其他线程看到
- 有序性: 程序执行的顺序按照代码的先后顺序执行
线程的生命周期
-
五种状态:
1.创建
2.就绪(等待使用CPU)
3.运行(执行start方法,获取到CPU使用权)
4.阻塞(放弃了CPU使用权,只有线程进入就绪态才能再次运行)
-
等待阻塞: 线程执行wait方法,该线程会释放占用的所有资源,不能自动唤醒,只能依靠其他线程调用notify或notifyAll唤醒.
notify: 唤醒正在等待这个对象的单个线程。如果有任何线程正在等待此对象,则选择其中一个线程进行唤醒。选择是任意的,由实现自行决定。
notfiyAll: 唤醒等待这个对象的所有线程
-
同步阻塞
运行的线程获取对象的同步锁,若该同步锁,被其他线程占用,则JVM会把该线程放入到锁池中
-
其他阻塞: 线程执行sleep方法或join方法,或者发出了IO请求,JVM将该线程置为阻塞态
5.死亡
-
-
Java中有6种线程状态
NEW:新创建的线程
WAITING:就绪态
RUNNABLE:运行态
BLOCKED:阻塞态
TIMED WAITING:线程处于定时等待状态
TERMINATED:已退出的线程
sleep,wait,yield,join
- sleep: 释放占用的资源,进入阻塞态
- wait: 释放占用的资源,进入阻塞态,不能自主唤醒,依靠其他线程通过noti fy或notifyAll唤醒
- yield: 执行后线程进入就绪状态, 马上释放cpu的使用权,但是保留了CPU的使用资格
- join: 执行后线程进入阻塞态,在B调用A的join, B会进入阻塞态,一直等待A执行完毕