线程与进程?
线程是指程序在执行过程中,能够执行程序代码的一个执行单元。
线程的状态4种:运行、就绪、挂起、结束。
进程是指一段正在执行的程序。
一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段、堆空间)、进程级资源(比如文件),但是各个线程拥有自己的栈空间。
使用多线程的好处?
使用多线程可以减少程序的响应时间。
与进程相比,线程的创建和切换开销更小。
多CPU或多核计算机本身就具有执行多线程的能力。
使用多线程能简化程序的结构,使程序便于理解和维护。一个复杂的进程可以分为多个线程来执行。
线程的状态?
1.新建(New):创建后尚未启动的线程的状态
2.运行(Runnable):包含Running和Ready
3.无限期等待(Waiting):不会被分配CPU执行时间,需要显式被唤醒
没有设置Timeout参数的Object.wait()方法。
没有设置Timeout参数的Thread.join()方法。
LockSupport.park()方法。
4.限期等待(Timed Waiting):在一定时间后会由系统自动唤醒
Thread.sleep()方法。
设置了Timeout参数的Object.wait()方法。
设置了Timeout参数的Thread.join()方法。
LockSupport.parkNanos()方法。
LockSupport.parkUnitil()方法。
5.阻塞(Blocked):等待获取排它锁
6.结束(Terminated):已终止线程的状态,线程已经结束执行
注意:
在线程run方法执行完后,线程已经处于结束状态,线程不可以再被唤醒
如果这个时候又调用线程的start方法,将会报错
线程状态之间的转换
1.新建->可运行:执行t.start()
2.可运行->运行:线程被os选中
3.运行->死亡: run()、main()方法结束;异常退出
4.运行->阻塞:等待用户输入、Thread.sleep()
5.阻塞->可运行:用户输入完成、Thread.sleep()时间结束
6.运行->等待队列:o.wait()
7.等待队列->锁池:synchronized(o);被其他线程唤醒:o.notify()或o.notifyAll()
8.锁池->可运行:获得锁标识
9.运行->可运行:CPU时间片用完;Thread.yield()