电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOC文档下载
分享到微信 分享到微博 分享到QQ空间

day13(多线程通信)总结

  • 资源ID:460023466       资源大小:28.50KB        全文页数:8页
  • 资源格式: DOC        下载积分:15金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要15金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

day13(多线程通信)总结

Day13总结1、 单列设计模式:1、 恶汉式:代码体现:Class SinglePrivtae static final Single s=new Single();Private Single()Public static Single getInstance()Return s;2、 懒汉式:延迟加载,存在着多线程并发访问的安全问题,需要使用同步来解决安全问题,但是同步会降低效率,所以使用双重if()判断形式解决效率低的问题。实现代码:Class SinglePrivate Single()Private static Single s=null;Public static Single getInstance()If(s=null)Synchroinzed(Single.class)If(s=null)S=new Single();Return s;2、 死锁:即同步的弊端,不是线程和进程没有了,而是不动了。表现形式:同步嵌套的时候,使用的锁不一样,容易引发死锁。实现代码: 3、 线程间通信:其实就是多个线程在操作同一个资源,但是操作的动作不同,动作不同,意味着线程的任务是不一样的。就需要对任务对象进行单独的封装和描述。4、 等待唤醒机制:最重要的机制重点掌握Wait():等待:让当前线程出于冻结状态,当前线程就被存储到线程池当中。Notify();唤醒线程池中的任意一个线程,让该线程恢复到运行状态,会具备CPU的执行资格。notifyAll():唤醒线程池中的所有等待的线程,让它们具备CPU的执行资格。所谓的监视器:就是多线程中的锁。上面几个功能必须在同步当中,要标示清楚它所在的锁。也就说:wait到底让哪个锁上的线程等待了,notify:到底是唤醒了哪个锁上被等待的线程。NotifyAll:用上面的一样。为什么是Object中的方法?因为这些方法都是必须要标识出所属的锁,而锁是任意的对象。能被任意对象调用的方法一定定义在Object类中。一般在使用等待和唤醒时通常都得有标记。代码优化:ResourceDemo3.javaclass Resourceprivate String name;private String sex;private boolean flag = false;public synchronized void set(String name,String sex)if(flag)trythis.wait();catch(Exception e) = name;this.sex = sex;flag = true;this.notify();public synchronized void out()if(!flag)trythis.wait();catch(Exception e)System.out.println(name+"-"+sex);flag = false;this.notify();class Input implements RunnableResource r;Input(Resource r)this.r = r;public void run()int x = 0;while (true)if(x=0)r.set("mike","nan");elser.set("丽丽","女女女女女");x = (x+1)%2;class Output implements RunnableResource r;Output(Resource r)this.r = r;public void run()while(true)r.out();class ResourceDemo3public static void main(String args) Resource r = new Resource();Input in = new Input(r);Output out = new Output(r);Thread t1 = new Thread(in);Thread t2 = new Thread(out);t1.start();t2.start();4、 生产者和消费者问题: 遇到的问题:1、 出现了错误数据,是因为多生产多消费的时候,被唤醒的线程没有再次判断标记就执行了,解决时将if判断边成while循环判断,(这种方式是最安全的)2、 有了while判断后死锁了,因为本方线程唤醒的有可能还是本方线程,所以导致死锁,解决:本方必须唤醒对放才有效,notify只能唤醒一个, 还不确定,所以干脆唤醒所有的,肯定包含对象,至于被唤醒的本方会判断标记是否继续等待。实现代码:Class ResourcePrvate String name;Private int count;Private boolean flag;Private synchronized void set(String name)While(flag)TryThis.wait();Catch(Exception e)=name+count;Count+;System.out.println(Thread.currentThread().getName()+".生产者"+)Flag=true;notifyAll();Public synchronized void out()While(!flag)Trythsi.wait();catch(Exception e)System.out.println(Thread.currentThread().getName()+".消费者"+);Flag=false;notifyAll();/唤醒所有的线程。Class Producer implements RunnablePrivate Resource r;Producer(Resource r)This.r=r;Public void run()While(true)R.set("商品");Class Consumer implements RunnablePrivate Resource r;Consumder(Resource r)This,r=r;Public void run()While(true)R.out();Class ProConDemo/主函数Resource r=new Resource(0;Producer pro=new Producer(r);Consumer con=new Consumer(r);Thread t0=new Thread(pro);Thread t1=new Thread(pro);Thread t2=new Thread(con);Thread t3=new Thread(con);T0.start();T1.start();T2.start();T3.start();总结:以上解决的方式还存折弊端,因为唤醒了所有的线程,但是如果唤醒了本方的,还是要进行本方的判断,这就会降低效率,所以这里我们在学习一种可以避免这种情况的方法。Lock接口:JDK1.5版本后对多线程中的内部细节进行了升级改良,在java.util.concurrent.locks包中提供了一个lock接口。比同步应用的更为广泛,lock接口中提供了loc()获取锁,unlock释放锁的操作,这样更符合面向对象的思想,将锁这种事物封装成了对象。Eg:Public void run()Synchronized(obj)code.这种方式为隐式锁机制,我们不能清楚的知道它里面是如何获取锁和释放锁的。Lock.lockPublic void run()TryLock.lock();获取锁Code.Finally这里也是finally的用法的体现,一定要执行的代码,常常用于关闭资源Lock.unlock();释放锁,实现代码:import java.util.concurrent.locks.*;class Resourceprivate String name;/定义商品的名称private int count;/定义计数器用来对商品进行记录private boolean flag;/定义一个标记,用来控制多线程之间的状态转换。private Lock lock = new ReentrantLock();/用reentrantLock创建一个lock对象。private Condition con1 = lock.newCondition();/一组监视器监视生产者private Condition con2 = lock.newCondition();/一组监视器监视生产者public void set(String name)/lock.lock();/获取锁 .trywhile(flag)/判断获取了执行的权的线程是否满足要求,如果为false则不用捕获异常。直接生产产品,如果为真,值捕获异常,等待trycon1.await();catch(Exception e)/ (活) t1 (活)t0 = name+count; /将生产的产品的名称和记录的数目赋值给namecount+;/生产的产品数自加System.out.println(Thread.currentThread().getName()+".生产者."+);/生产者 商品0 生产者 商品1 商品2获取生产者生产的商品的名称以及数值。flag = true;/执行完打印之后通过flag标记赋值来改变线程的状态。con2.signal();/用到了新特性中的特点。Condition中的方法signal唤醒功能,当前面加上对应的控制比较时,这样就可以唤醒对方中的线程。也就是唤醒了消费者中的线程。这样做的能提高效率,避免了上面那种方法中唤醒的如果是本方法中的线程对象。降低效率。finallylock.unlock();/释放锁。public void out()/ lock.lock();

注意事项

本文(day13(多线程通信)总结)为本站会员(cl****1)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.