电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

day13(多线程通信)总结

8页
  • 卖家[上传人]:cl****1
  • 文档编号:460023466
  • 上传时间:2022-12-04
  • 文档格式:DOC
  • 文档大小:28.50KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、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、 线程间通信:其实就是多个线程在操作同一个资源,但是操作的动作不同,动作不同,意味着线程的任务是不一

      2、样的。就需要对任务对象进行单独的封装和描述。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 n

      3、ame,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

      4、.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 f

      5、lag;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

      6、 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接口

      7、。比同步应用的更为广泛,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

      8、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分享,可在线阅读,更多相关《day13(多线程通信)总结》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.