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

多线程sleepyieldwait区别

3页
  • 卖家[上传人]:ni****g
  • 文档编号:493429435
  • 上传时间:2024-01-28
  • 文档格式:DOCX
  • 文档大小:12.24KB
  • / 3 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、yield() sleep() wait()区别(1)简说1. sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它 并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注 意该方法要捕获异常比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另 一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先 级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级 的线程有执行的机会。2. join()join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完 毕后再往下继续执行。注意该方法也要捕获异常。3. yield()它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级 的线程有执行的机会。4. wait()和 notify。、notifyA

      2、ll()这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使 用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享 数据的存取。但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出 Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活 控制。wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数 据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一 个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁 标志等待池中没有线程,则notify()不起作用。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。注意这三个方法都是java.lang.Ojbect的方法!2. run()和 start()这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线 程将自动调用run()方法,这是由Java的内

      3、存机制规定的。并且run()方法必须是public访问 权限,返回值类型为void。3. 关键字 Synchronized这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有 一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据将被“上锁”,阻止其他 线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。public ThreadTest implements Runnable(public synchronized void run()(for(int i=0;i10;i+)System.out.println( + i);public static void main(String args) (Runnable r1 = new ThreadTest();Runnable r2 = new ThreadTest();Thread t1 = new Thread(r1);Thread t2 = new Thread(r2);t1.start();t2.start();以上这段程序中的i变量并不是共享数据,也就是这里的Syn

      4、chronized关键字并未起作 用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和 r2两个对象的i变量是并不是共享数据。当把代码改成如下:Synchronized关键字才会起作用Runnable r = new ThreadTest();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start();wait()和 notify(),notifyAll()是 Object 类的方法,sleep()和 yield()是 Thread 类的方法。(1) .常用的 wait 方法有 wait()和 wait(long timeout):void wait()在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程 等待。void wait(long timeout)在其他线程调用此对象的notify()方法或notifyAll()方法,或者 超过指定的时间量前,导致当前线程等待。wait()后,线程会释放掉它所占有的“锁标志”,从而

      5、使线程所在对象中的其它synchronized 数据可被别的线程使用。wait()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或 synchronized block 中进行调用。如果在 non-synchronized 函数或 non-synchronized block 中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。(2) .Thread.sleep(long millis),必须带有一个时间参数。sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被 执行;sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线 程有执行的机会;sleep(long)是不会释放锁标志的。.yield()没有参数。sleep方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由 程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。yield()也不会释放锁标志。实际上,yield()方法对应了如下操作:先检测当前是否有相同优先级的线程处于同可运 行状态,如有,则把CPU的占有权交给此线程,否则继续运行原来的线程。所以yield() 方法称为“退让”,它把运行机会让给了同等优先级的其他线程。sleep方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在 可运行状态,所以不可能让出较低优先级的线程些时获得CPU占有权。在一个运行系统中, 如果较高优先级的线程没有调用sleep方法,又没有受到I/O阻塞,那么较低优先级线程 只能等待所有较高优先级的线程运行结束,才有机会运行。yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执 行状态后马上又被执行。所以yield()只能使同优先级的线程有执行的机会。

      《多线程sleepyieldwait区别》由会员ni****g分享,可在线阅读,更多相关《多线程sleepyieldwait区别》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党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.