多线程:让几个方法同时执行
多线程的效率更高
进程是系统资源分配的单位
线程是CPU调度和执行的单位
main为主线程
main函数叫做用户线程,gc线程(JVM给的)叫做守护线程
多线程的目的:就是可以同时执行多个方法
二、线程实现(重点) 1、线程创建 (Thread、Runnable、Callable)
thread类实现了runnable接口
注意:调用run、start方法产生的结果是不同的。
线程不一定立即执行,CPU安排调度
注意:是调用start开启线程,而不是run方法
运行结果:
//创建线程对象,通过线程对象来开启我们的线程,【代理】 // Thread thread=new Thread(testThread3); // thread.start(); //合并为下: new Thread(testThread3).start();4)案例 4、小结
使用runnable接口的好处:
-
避免单继承的局限性,方便同一个对象被多个线程使用
-
一份资源,多个代理
运行结果:
运行结果:
任何一个接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口,对于函数式接口,可以通过lambda表达式来创建该接口的对象。
多个参数的时候:
runnable是函数式接口,可以使用lambda表达式来进行简化
推荐线程自己停下来,
建议使用一个标志位让线程停下来
运行结果:
注意:一定要让线程自己停下来
时间的单位是毫秒
sleep会有异常,需要抛出
每个对象都有一把锁,sleep不会释放锁
2)demo1:模拟网络延时主要的作用:放大问题的发生性
会有-1
让正在执行的程序暂停,但不阻塞,让线程从运行状态转化为就绪状态,让CPU在重新进行调度。
礼让成功:
礼让不成功:
可以想象成插队
运行结果:
当main线程到200的时候,会让testJoin强制插队,对把testJoin执行完才会返回执行main线程
线程一旦进入死亡状态,就不能再次启动了。
性能倒置
运行结果:
注意:先设置优先级,再启动
7、守护线程 1)简述
main -》用户线程
gc-》守护线程
运行结果:
多个线程 *** 作同一个资源
并发问题-》线程同步-》线程同步其实是一种等待机制
对象等待池
每个对象都有一把锁,sleep不会释放锁。
线程同步需要:队列+锁 -》安全
2、三大不安全案例 1)demo1每个线程都在自己的工作内存交互,内存控制不当会造成数据不一致
sleep可以放大问题的发生性
只有修改代码才需要锁
synchronized块 锁住的对象是需要增删改的对象即可
运行结果:
出现死锁
修改:
解决方法:就是不要让一个资源拿对方的锁就可以解决了。
显式
运行结果:
利用缓冲区解决:管程法
运行结果:
注意:要使用while,而非if,不然会出现脏读
3、解决方法:信号灯法信号灯法:标志位解决
运行结果:
运行结果:
运行结果:
synchronized、lock等
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)