推荐参考:https://www.cnblogs.com/wxd0108/p/5479442.html
推荐参考的博客讲的很详细,线程的生命周期图画的不错
1(1).进程:每一个进程都有自己独立的内存空间,这个内存空间有操作系统分配
(2).线程:一个进程中的一条执行流程
线程不可以脱离进程独立执行(计算机最小处理的就是进程)
可以理解线程是某一个进程下多条不同的流程互不影响的执行代码流程
2.线程的分类:
前台线程 看得到执行代码的线程 线程执行main --》main线程
前台线程可以阻止线程退出。
后台线程
当前台线程结束,守护线程也会结束。
3.线程的使用:
使用线程让多个线程同时执行
4.线程的生命周期
新建:新建了线程对象
就绪 t.start();
运行 线程得到cpu以后执行代码 run();
阻塞 代码暂停运行 多种原因可导致阻塞
死亡 多种原因
start() 获得处理器资源 run执行完成
新建——》就绪-----------------》运行-----------------》死亡
^《----------------- | Error或Exception
| 失去处理器资源 |
| | sleep
| | IO阻塞
| |
等待池等待 - --- 阻塞 《 ____ | 等待同步锁
等待通知
5.新建:使用new 关键字创建一个线程,该线程处于新建状态
一个类继承Thread类,重写run方法--》得到新的线程类
实现runnable重写run方法--》得到新的线程类
6.就绪状态:线程对象调用start()方法,该线程处于就绪状态(线程获得CPU,等待执行)
线程的启动是从调用start()方法开始的。
7.永远不要调用线程对象的run()方法
如果直接调用 run() 方法,系统会把该线程对象当成普通对象,run()方法也将变成一个普通方法(而不是线程执行体)而立即执行。
如果直接调用了 run() 方法,则该线程不再处于新建状态,
如果直接调用了 run() 方法,则在run() 方法里不能直接通过this.getName() 方法获得线程名
8.阻塞状态:代码暂停运行
挂起:sleep(毫秒);join();yield();
怎么恢复:sleep:睡眠时间结束
join:目标线程执行完毕
yield:让出cpu执行权限立刻回到就绪状态
9:锁池等待 : 在run方法中执行了加锁的代码,但是锁被其他线程获取走了,当前线程就会到锁池等待.
恢复为就绪状态:
当其他线程释放锁资源,立刻回到就绪状态
10:等待池等待 : 当执行wait()方法以后就会到等待池等待
恢复为锁池等待
当其他线程执行了notify/notifyall方法的时候回从等待池回到锁池等待.
注: wait()方法会释放锁资源
11:死亡状态:当线程执行完run方法中所有代码就会变成死亡状态.
run方法执行完毕