进程:一个程序打开就是一个进程
线程:进程中包含线程
创建线程的4中方式
1.创建thread类(只能单一继承)
2.实现Runable接口(实现run方法的时候没有返回值,不允许抛异常)
3.callable接口(实现run方法的时候有返回值,允许抛异常)
4.使用线程池(用线程池,每次可以从线程池中拿一个线程)
线程的生命周期详解
(1)新建
new一个thread类,调用star方法,进入线程的一个新建状态,主要是为线程类分配类存,创建成员变量
(2)进入就绪状态
就是你调了start方法会进入就绪,这个时候是给线程创建方法栈,创建程序执行器,准备进行执行,正在等待,就是就绪状态
(3)执行
什么时候执行,就是代码调度器,调度在你这个线程上,拿到cup的执行权限的时候 ,这个时候就可以进行执行了,让CPU进行运行,运行过程中呢
(4)阻塞
如果调用了sleep方法,或者调用阻塞式IO流了,或者调用了同步锁,或者等待通知,或者调用suspend方法把线程挂起了,当前线程进入阻塞状态
(5)重新就绪
sleep时间到了,IO流读到数据了,或者拿到同步锁了,或者收到其他的线程通知了,或者调用resive方法,重新就绪
(6)运行
程序的调度器调到你的CPU了,就可以再次运行了
(7)死亡
调用stop方法,或者出错error了,或者抛出错误了,run、call正常结束了
3.线程安全和线程不安全的区别
线程安全:在单线程下的结果是444 多线程的结果也是444 单线程和多线程下结果相同
线程不安全:单线程和多线程执行结果不一致
线程不安全的原因:
1.多个线程在操作共享的数据
2.操作共享的数据有多条
3.多个线程对共享的数据有些写的操作
用锁的方式更加的灵活,知道什么时候开始加锁,什么时候放开锁,放在锁要放在finally里面,保证不死锁,当前线程有异常,不会阻塞后面的线程。不然后面的线程就找不到对象了