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