摘要:本文主要向大家介绍了Java语言多线程编程实战指南,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了Java语言多线程编程实战指南,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
1. 线程活性故障
1. 死锁(Deadlock)
1. 如果多个线程因相互等待对方而被永远暂停(线程生命周期状态为Blocked或者Waiting),则称之为产生了死锁.
2. 死锁产生的四个必要条件:
1. 互斥条件:一个资源每次只能被一个线程使用
2. 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放
3. 不剥夺条件:线程已经获得的资源,在未使用完之前,不能强行剥夺
4. 循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系
3. 死锁的避免方法:
1. 粗锁法(Coarsen-grained Lock):使用粗粒度的锁代替多个锁
2. 锁排序法(Lock Ordering):相关线程使用全局统一顺序申请锁
3. 使用ReentrantLock.tryLock( )搞定
4. 终极大招:不使用锁,啊哈哈~~~
4. 死锁的恢复:
1. 定义一个工作者线程专门用于死锁检测与恢复
2. 死锁恢复意义不大
2. 锁死(Lockout)
1. 等待线程由于唤醒条件永远无法成立,导致该线程一直处于非运行状态,称为这个线程锁死了。
1. 信号丢失锁死
1. wait方法之前没有对保护条件进行判断
2. 嵌套监视器锁死
1. 嵌套锁导致等待线程永远无法被唤醒的一种活性故障
3. 线程饥饿(Thread Starvation)
1. 指线程一直无法获取其所需的资源而导致其任务一直无法进展的一种活性故障
4. 活锁(LiveLock)
1. 指线程一直处于运行状态,但是其任务却一直无法进展的一种活性故障
2. 线程管理
1. 线程组(ThreadGroup)已废弃
2. 可靠性:线程的未捕获异常与监控
1. 接口:UncaughExceptionHandler
2. 该接口在Thread类内部定义,只定义了一个方法void uncaughtException(Thread t, Throwable e)
3. 线程工厂(ThreadFactory)
1. 方法public Thread newThread(Runnable r)
4. 线程池
1. 线程的开销如下:
1. 线程的创建与启动的开销
2. 线程的销毁
3. 线程调度的开销
4. 一个系统能够创建的线程总数总是受限于该系统的所拥有的处理器数目
2. 线程池工作原理:
1.
2. JUC中的线程池:
1. java.util.concurrent.ThreadPoolExecutor类就是一个线程池
2. 客户端调用ThreadPoolExecutor.submit(Runnable task)提交任务
3. 线程池内部维护的工作者线程的数量就是该线程池的线程池大小,有3种形态:
1. 当前线程池大小:表示线程池中实际工作者线程的数量
2. 最大线程池大小(maxinumPoolSize ):表示线程池中允许存在的工作者线程的数量上限
3. 核心线程大小(corePoolSize ):表示一个不大于最大线程池大小的工作者线程数量上限
1. 如果运行的线程少于corePoolSize,则Executor始终首选添加新的线程,而不进行排队
2. 如果运行的线程等于或者多于corePoolSize,则Executor始终首选将请求加入队列,而不是添加新线程
3. 如果无法将请求加入队列,即队列已经满了,则创建新的线程,除非创建此线程超出maxinumPoolSize,在这种情况下,任务将被拒绝。
4.
5. 线程池通过threadFactory.newThread方法来创建新的线程
6. Executors中提供了创建线程池的快捷方法:
1. newCachedThreadPool( )
1. 核心线程池大小为0,最大线程池大小不受限;来一个创建一个线程
2. 适合用来执行大量耗时较短且提交频率较高的任务
2. newFixedThreadPool( )
1. 固定大小的线程池
2. 当线程池大小达到核心线程池大小,就不会增加也不会减小工作者线程的固定大小的线程池
3. newSingleThreadExecutor( )
1. 便于实现单(多)生产者-消费者模式
7. 线程池关闭:
1. ThreadPoolExecutor.shutdown( )/shutdownNow( )
5. 任务的处理结果、异常处理与取消
1. Callable接口也是对任务的抽象,相当于一个增强型的Runnable接口,提供返回值代表任务的处理结果;
2. 返回结果为Future,该Future接口实例可被看做提交给线程池执行的任务的处理结果句柄(Handler)。
3. 客户端代码应该尽可能早的向线程池提交任务,并仅在需要相应任务的处理结果数据的那一刻才调用Future.get()方法
6. 线程池监控
1. ThreadPoolExecutor提供了线程池监控相关方法
7. 线程池死锁:
1. 同一个线程池只能用于执行相互独立的任务。彼此有依赖关系的任务需要提交给不同的线程池执行以避免死锁
以上就是职坐标整理发布关于JAVA的介绍,先祝大家对它有了一定的了解吧,了解更多内容,请关注职坐标编程语言JAVA频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号