多线程通信之优化升级+JDK1.5升级版后的新方案
2015-05-24 15:53
288 查看
1.刚开始时由于线程的执行动作一致,所以只要同步关键代码,即可解决访问共享数据的安全问题。
2.当线程动作不相同,利于t1存,t2取时,会出现动作不同,在写同步代码的时候,一定注意同步的前提
一、必须是多个线程
二、锁必须是同一个锁(可以使用内存中的唯一对象)
本人学习到此处,有一疑问,这个锁具体是怎么个运转机制,由于封装,未能了解,如果有大牛,还请给解释下。。。
3.为了实现t1、t2线程的存取动作交替运行,加入了flag标记为,引入了wait(),notify(),notifyAll()方法,但同时也埋下了隐患,
在flag标记为判断时,如果使用if语句判断,会使得唤醒的线程没能实时判断flag标记,出现了数据错乱,使用while循环可以解决
在使用notify()和notifyAll()时会唤醒本方的线程,(浪费资源,因为要存取交替进行,存线程唤醒存线程,唤醒后还是会继续wait()),而且使用notify()时可能会出现线程全部处于等待的挂机状态
4.当多生产者消费者问题出现后,即真正的多线程时,使用notifyAll()会极大地浪费效率,我们可以使用JDK1.5升级的新功能
1.使用lock代替synchronized函数和synchronized代码块
2.使用condition对象代替监视器,即原来的object,但会抛出异常,这个需要注意
3.lock,lock lock.unlock condition.await() condition.signal condition.signalAll 熟悉这几个的使用方法
4.由于lock升级后支持多个相关的condition对象,即生产者代码中可以选择性的唤醒消费者的线程,一个或者多个,完美的解决了原来的motify唤醒本方线程的问题
以下是看毕向东老师视频中的一些总结,感觉很有必要,在这里写下来共同分享
1.操作线程的方法定义在object类中:因为这些方法在操作同步中线程时,都必须要标识他们所操作线程的锁,即监视器,只有同一个锁上的等待线程,才可以被notify唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法要定义在上帝object类中。
2.interrupt将冻结的线程强制转换到运行状态,如唤醒那些在运行时抛出异常的线程,这样保证程序不被挂起
3.线程停止:由于stop方法已经过期,现在停止线程的话,,可以将run()方法结束。开启多线程运行,运行代码通常是循环结构,只要控制住循环,让run方法结束,就可以停止线程。但是当线程处于了冻结状态,无法读取标记flag,这样线程就没法结束。可以使用interrupt方法,将线程的冻结状态清除,强制让线程回复到运行状态。
4.守护线程:使用方法,要在start前标识为守护线程,setDaemon
当正在运行的线程都是守护线程时,Java虚拟机会退出
可以将某些依赖别的线程的线程标识为守护线程,例,存取数据交替时,如果取数线程终止了,那么存数就没有意义了,可以标记为守护线程。
5.join():被线程调用时,即线程申请加入运行中来,表示他需要cpu资源,一旦线程调用join()方法后,主线程会等待该线程运行结束后,在运行主线程
6.Thread.toString():编号+优先级+线程组
优先级:一共有1-10级,一般为5,可以使用setPriority设置,由于一般只表示1,5,10,可以用MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY
注:设置为最高后,不代表cpu只执行它,只是执行频率会高,最低同理
线程组:该线程被谁开启,即属于哪个组
7.yield():暂停当前线程,执行别的线程,可以保证所有线程都被执行到
心得:由于主函数包含的内容越来越多,如果按顺序执行,用户的等待时间将会大大增加,体验性降低,此时可以用线程将一些功能代码封装,这样主函数启动的同时,有多个线程在执行功能模块,给予用户很好的体验度,等待时间大大减少。当然当部分代码需要被单独运行时,也可以用线程封装起来。
2.当线程动作不相同,利于t1存,t2取时,会出现动作不同,在写同步代码的时候,一定注意同步的前提
一、必须是多个线程
二、锁必须是同一个锁(可以使用内存中的唯一对象)
本人学习到此处,有一疑问,这个锁具体是怎么个运转机制,由于封装,未能了解,如果有大牛,还请给解释下。。。
3.为了实现t1、t2线程的存取动作交替运行,加入了flag标记为,引入了wait(),notify(),notifyAll()方法,但同时也埋下了隐患,
在flag标记为判断时,如果使用if语句判断,会使得唤醒的线程没能实时判断flag标记,出现了数据错乱,使用while循环可以解决
在使用notify()和notifyAll()时会唤醒本方的线程,(浪费资源,因为要存取交替进行,存线程唤醒存线程,唤醒后还是会继续wait()),而且使用notify()时可能会出现线程全部处于等待的挂机状态
4.当多生产者消费者问题出现后,即真正的多线程时,使用notifyAll()会极大地浪费效率,我们可以使用JDK1.5升级的新功能
1.使用lock代替synchronized函数和synchronized代码块
2.使用condition对象代替监视器,即原来的object,但会抛出异常,这个需要注意
3.lock,lock lock.unlock condition.await() condition.signal condition.signalAll 熟悉这几个的使用方法
4.由于lock升级后支持多个相关的condition对象,即生产者代码中可以选择性的唤醒消费者的线程,一个或者多个,完美的解决了原来的motify唤醒本方线程的问题
以下是看毕向东老师视频中的一些总结,感觉很有必要,在这里写下来共同分享
1.操作线程的方法定义在object类中:因为这些方法在操作同步中线程时,都必须要标识他们所操作线程的锁,即监视器,只有同一个锁上的等待线程,才可以被notify唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法要定义在上帝object类中。
2.interrupt将冻结的线程强制转换到运行状态,如唤醒那些在运行时抛出异常的线程,这样保证程序不被挂起
3.线程停止:由于stop方法已经过期,现在停止线程的话,,可以将run()方法结束。开启多线程运行,运行代码通常是循环结构,只要控制住循环,让run方法结束,就可以停止线程。但是当线程处于了冻结状态,无法读取标记flag,这样线程就没法结束。可以使用interrupt方法,将线程的冻结状态清除,强制让线程回复到运行状态。
4.守护线程:使用方法,要在start前标识为守护线程,setDaemon
当正在运行的线程都是守护线程时,Java虚拟机会退出
可以将某些依赖别的线程的线程标识为守护线程,例,存取数据交替时,如果取数线程终止了,那么存数就没有意义了,可以标记为守护线程。
5.join():被线程调用时,即线程申请加入运行中来,表示他需要cpu资源,一旦线程调用join()方法后,主线程会等待该线程运行结束后,在运行主线程
6.Thread.toString():编号+优先级+线程组
优先级:一共有1-10级,一般为5,可以使用setPriority设置,由于一般只表示1,5,10,可以用MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY
注:设置为最高后,不代表cpu只执行它,只是执行频率会高,最低同理
线程组:该线程被谁开启,即属于哪个组
7.yield():暂停当前线程,执行别的线程,可以保证所有线程都被执行到
心得:由于主函数包含的内容越来越多,如果按顺序执行,用户的等待时间将会大大增加,体验性降低,此时可以用线程将一些功能代码封装,这样主函数启动的同时,有多个线程在执行功能模块,给予用户很好的体验度,等待时间大大减少。当然当部分代码需要被单独运行时,也可以用线程封装起来。
相关文章推荐
- JDK1.5中的多线程升级方案
- Java基础学习__多线程(线程间通信--生产者消费者JDK5.0升级版)
- 一个容易被大家忽略的多线程性能优化方案:Cache行级别优化
- 技术-技术方案优化策略--多线程与分布式
- 对多线程通信的优化
- 多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结
- Java---20---多线程:生产者和消费者2(JDK1.5升级版)
- SOCKET通信中多线程编程的性能优化问题
- 多线程锁升级解决方案(JDK1.5及以后)
- 黑马程序员 java 基础 毕向东 面向对象 多线程 通信 优化 jdk 1.5 之后新特性Lock
- EPON ONU软件升级的若干优化方案
- 黑马程序员,JDK1.5中提供了多线程升级解决方案Lock操作
- Java多线程之并发协作生产者消费者设计模式JDK1.5.0+升级优化版
- 黑马程序员----JDK1.5版本中提供多线程升级解决方案
- 前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
- 29-多线程(线程间通信-多生产者多消费者问题-JDK1.5新特性-Condition).1 2 31-多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例). 1 2
- java多线程-线程间通信_代码优化
- 【多线程】三种方案实现多线程之间相互协作的通信
- 黑马程序员----多线程3(线程间通信、JDK1.5新特性、线程类的其他方法)
- 【多线程】三种方案实现多线程之间相互协作的通信