1.线程与进程 线程 进程之间通信
进程:系统资源分配及调度的最小单位,一个应用就是一个进程、资源分配的最小调度单位。系统开辟独立空间
线程:程序执行的最小单元 线程是基于进程执行,一个进程中可以存在多个线程
2.线程的创建方式
线程的创建一般分为两种 AClass implements Runnable / AClass extends Runnable,除了这两种别无他法。FutureTask和Callable的方式说穿了就是FutureTask implements RunnableFuture,但是呢RunnableFuture实现了Runnable 的接口Callable不要杠~官方文档说的很清楚
A2.线程生命周期
线程的生命周期分为5种
1.就绪态:新建了线程对象 但是没有执行run方法
2.运行态:Java将就绪态和运行态合并为运行态 当线程对象调用start 即进入线程就绪态,加入线程池,等待CPU时间片轮转调度
3.等待:进入该状态后需要其他线程特定动作(notify notifyAll)
4.等待超时:它在指定时间自动返回
5.阻塞:线程阻塞于锁
6.终止:表示该线程已经执行完毕。
线程生命周期3.线程问题及解决方式
死锁
造成死锁的几种方式:
A.互斥条件:资源使用存在排他性 某一资源被当前占有,需要很大时间才能释放,请求者一直等待,直到调用者释放
B:环路等待条件:P0->P1->P2->P0(资源等待顺序)
C:请求和保持条件:获得一些资源,有需要请求其他资源无果,同时自己手里资源不愿意放手
D:不剥夺条件:得到该资源自己使用完才放手,其他请求者无法剥夺
危害
1、线程不工作了,但是整个程序还是活着的2、没有任何的异常信息可以供我们检查。3、一旦程序发生了发生了死锁,是没有任何的办法恢复的,只能重启程序,对正式已发布程序来说,这是个很严重的问题。
总结:多个调用者调用不同的资源顺序不对且争夺到的资源不放手
理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。
只要打破四个必要条件之一就能有效预防死锁的发生。
打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。
打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。
打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。
打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。
避免死锁常见的算法有有序资源分配法、银行家算法。
解决方案:打破死锁调用顺序:1.尝试加入拿锁机制 2.内部通过比较确定拿锁顺序 3.算法银行家算法(自动百度) 有序资源分配法(自动百度)
活锁:两个线程在尝试拿锁的机制中,发生多个线程之间互相谦让,不断发生同一个线程总是拿到同一把锁,在尝试拿另一把锁时因为拿不到,而将本来已经持有的锁释放的过程。
解决方案:线程睡眠一个随机数
线程饥饿:线程优先等级过低,无法获得执行时间
网友评论