线程
2022-02-20 17:31:42 12 举报
AI智能生成
线程的一些特性
作者其他创作
大纲/内容
线程的生命周期
1.初始化线程任务,new对象
2.执行start方法,进入就绪状态。
3.调度run方法,进入线程运行状态
4.sleep状态,非永久等待状态
5.wait状态,永久等待状态
6.遇到synchronized关键字,争夺锁时没有拿到锁进入阻塞状态。
7.线程执行完毕进入销毁结束状态
2.执行start方法,进入就绪状态。
3.调度run方法,进入线程运行状态
4.sleep状态,非永久等待状态
5.wait状态,永久等待状态
6.遇到synchronized关键字,争夺锁时没有拿到锁进入阻塞状态。
7.线程执行完毕进入销毁结束状态
线程启动停止
1.启动执行start
2.暴力停止执行stop方法,已经过时
3.执行interrupt修改中断标记为true,并且中断线程的作用。
如果碰到线程阻塞会抛出异常,在异常里面状态默认修改为false,
再次执行interrupt没有线程阻塞才会停止线程。
4.执行interrupted,获取中断标记,并复位于false
5.执行isinterrupted,获取中断标记
2.暴力停止执行stop方法,已经过时
3.执行interrupt修改中断标记为true,并且中断线程的作用。
如果碰到线程阻塞会抛出异常,在异常里面状态默认修改为false,
再次执行interrupt没有线程阻塞才会停止线程。
4.执行interrupted,获取中断标记,并复位于false
5.执行isinterrupted,获取中断标记
线程的中断使用场景是线程一直执行,不会自己停止
线程安全性问题
1.原子性问题(java一行代码可能编译后是多行代码可能先于执行,执行一半,后执行的其它线程可能已经执行完。)
2.可见性问题(操作一个变量时,线程拿到主内存的变量在各自的线程内存都修改了这个变量,但是修改没有同步)
3.有序性问题(并发线程可能会扰乱代码执行顺序)
2.可见性问题(操作一个变量时,线程拿到主内存的变量在各自的线程内存都修改了这个变量,但是修改没有同步)
3.有序性问题(并发线程可能会扰乱代码执行顺序)
线程死锁问题
多个线程同时争夺对方的锁,解决办法之一,线程执行完自己的业务代码,最后执行notify释放锁
分支主题
线程和进程
线程是cpu最小执行单位,顺序控制流程
进程是正在执行的应用程序
并行和并发
并行是一个时间点同时执行多个任务所以必须是多核cpu
并发是一个时间段执行多个任务,同一时刻只有一个任务在执行,多任务之间根据cpu分配时间片来回切换执行
线程和cpu的关系
单核cpu,多线程实现是由cpu给各个线程分配时间片,来回切换时间片拿到cpu控制权,切换前会记住当前线程任务的执行节点,执行线程,速度极快
线程创建方式
继承thread
1.自定义一个类继承thread。 2.然后重写run方法。
3.new这个对象。
4.执行start方法线程最终调用的是native修饰的start0方法,进入就绪状态向jvm发送指令,通过系统调度算法,cpu分配时间片给线程,接着java调度run方法。
3.new这个对象。
4.执行start方法线程最终调用的是native修饰的start0方法,进入就绪状态向jvm发送指令,通过系统调度算法,cpu分配时间片给线程,接着java调度run方法。
实现runnable
1.自定义一个类实现runable,形成一个任务。
2.重写run方法。
3.创建new 这个类对象。
3.通过thread去执行这个类任务。
4.同thread4
2.重写run方法。
3.创建new 这个类对象。
3.通过thread去执行这个类任务。
4.同thread4
实现callable
和runnable类似,不同之处有如下:
1.callable可以自己抛出异常,runnable只能手动捕获。
2.callable有返回值
3.callable的任务只能由线程池去调用。
1.callable可以自己抛出异常,runnable只能手动捕获。
2.callable有返回值
3.callable的任务只能由线程池去调用。
线程池创建
thread和runnable的区别
thread和runnable本质上一样,但是runnable可以更好的解耦,因为实现runable的类只是线程任务,而线程和这个任务是相互独立的
synchonized的使用方式
1.加在普通方法上(分别实现这个类,都执行这个方法不受锁的限制,因为只是方法加锁,但是对象不是同一个)
2.加在静态方法上(分别实现这个类,都执行这个方法受锁的限制,因为这样其实是给对象加锁)
3.加在代码块上
2.加在静态方法上(分别实现这个类,都执行这个方法受锁的限制,因为这样其实是给对象加锁)
3.加在代码块上
0 条评论
下一页