`
HelloSure
  • 浏览: 311180 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

多线程常用方法比较汇总

 
阅读更多
从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。
但是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。(这是yield的使用目的)
或者当前正在被服务的线程需要睡一会,醒来后继续被服务,这就是sleep。

sleep方法不推荐使用,可用wait。
线程退出最好自己实现,在运行状态中一直检验一个状态,如果这个状态为真,就一直运行,如果外界更改了这个状态变量,那么线程就停止运行。

sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;yield()只能使同优先级的线程有执行的机会。

当调用wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。

waite()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在 synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non- synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。


      1.sleep()方法
  在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
  sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
  2.wait()方法
  在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
  当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
  唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
  waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
  3.yield方法
  暂停当前正在执行的线程对象。
  yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
  yield()只能使同优先级或更高优先级的线程有执行的机会。
  4.join方法
  等待该线程终止。
  等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
分享到:
评论

相关推荐

    C#常用函数和方法集汇总

    在C#编程语言中,掌握常用的函数和方法是至关重要的,因为它们构成了程序的基本构建块。C#提供了丰富的内置函数和方法,可以帮助开发者高效地完成各种任务。以下是一些核心和常用的C#函数与方法的详细说明: 1. **...

    多线程IP端口扫描

    在IT领域,多线程IP端口扫描是一种常见的网络技术,用于快速探测网络中的设备和服务。这个主题涉及网络通信、操作系统、并发编程等多个知识点。以下将详细解释这些关键概念。 首先,我们需要理解“IP端口扫描”。在...

    Java常用英语汇总

    Java常用英语汇总ALLBACK CALLBACK首先是基于多线程的,没有线程的调用就不要谈回调.子类调用父类的构造方法叫回调用,那TMD的任何构造对象都叫回调了,因为任何对象至少继承了Object,构造时至少要调用Object的构造方法...

    算法、常用数据结构、文件资料、多线程和XML解析 资料汇总

    ### 知识点一:集合(Sets) #### Set 集合 - **特性**:`Set` 是一种不允许重复元素的数据结构。...这些知识点覆盖了 Java 中集合(Set 和 Map)、数组、多线程以及 XML 解析的基本概念和技术细节。

    多线程端口扫描程序

    **多线程端口扫描程序**是计算机网络中一种常用的技术,用于探测目标主机开放的网络端口。这种程序能够快速地向指定IP地址发送连接请求,检查哪些端口是监听状态,即服务正在运行。在本文中,我们将深入探讨多线程在...

    易语言源码易语言多线程端口扫描源码.rar

    在这个"易语言源码易语言多线程端口扫描源码.rar"压缩包中,包含的是使用易语言编写的多线程端口扫描程序的源代码。端口扫描是网络渗透测试和系统管理员日常工作中常用的一种技术,用于发现远程或本地主机开放的服务...

    实验一多线程计算PI值.doc

    多线程计算PI值是使用多线程技术来计算PI值的方法。该方法将积分过程分割成多个小任务,并将这些任务分配给多个线程。每个线程负责计算一个小任务,并将结果汇总到总的结果中。该方法可以提高计算速度和效率,并且...

    C#函数方法集,汇总c#.net常用函数和方法集

    本文将详细解析"C#函数方法集",帮助开发者掌握C#中的常用函数和方法。 1. **基础函数与方法** C#的基础函数包括数学运算、字符串操作、数组处理等。例如,`Console.WriteLine()`用于在控制台输出文本,`Math`类...

    JAVA面试题汇总(基础、容器、多线程等等).docx

    JAVA 面试题汇总(基础、容器、多线程等) _java 基础知识点_ 1. JDK 和 JRE 的区别:JDK(Java Development Kit)是 Java 开发工具包,提供了 Java 的开发环境和运行环境。JRE(Java Runtime Environment)是 ...

    Visual C#常用函数和方法集汇总

    以上仅是Visual C#常用函数和方法的一部分,实际编程中还有很多其他工具和技巧,如文件操作、网络通信、数据库交互等。不断学习和实践是提高编程技能的关键。通过深入理解这些基本函数和方法,开发者可以更高效地...

    多线程试卷参考答案.pdf

    以上是根据提供的部分内容对Java多线程知识点的汇总。由于文档内容可能因OCR扫描造成个别字的识别错误或漏识别,上述内容已尽可能修正和补充,以确保知识点的准确性和完整性。在实际使用时,需要结合完整的文档内容...

    Java常用词汇汇总

    17. **同步(Synchronization)**:在多线程环境中,同步确保同一时间只有一个线程能访问共享资源,防止数据不一致。 18. **设计模式(Design Pattern)**:设计模式是解决常见软件设计问题的通用可重用解决方案。 ...

    Android框架+常用控件汇总-侧滑、上下拉加载、tab、各种ui

    如网络下载,多线程与线程池的管理,数据库ORM,图片缓存管理,图片文件下载上传,Http请求工具,常用工具类(字符串,日期,文件处理,图片处理工具类等),能够使您的应用在团队开发中减少冗余代码,很大的提高了...

    VC多线程端口扫描程序.rar 开发技术 - 其它

    在IT领域,多线程编程是一项关键技能,尤其是在开发高效应用程序时。本资源"VC多线程端口扫描程序.rar"提供了一个使用Visual C++(VC)实现的端口扫描程序,它展示了如何利用多线程技术来加速网络扫描过程。端口扫描...

    多线程实现的快速搜索文件 注:网上搜索,已经验证.zip

    在IT领域,尤其是在软件开发中,多线程技术是一种常用的方法来提高程序的执行效率,尤其是在处理大量数据或需要并行执行任务时。本主题聚焦于如何使用C#语言实现多线程快速搜索文件,这是一项实用且高效的技术。下面...

    安卓手机常用术语汇总

    它的特点是简单、面向对象、安全且可移植性强,支持多线程编程,使得开发复杂的手机应用变得可能。 8. **Mophun**:Mophun是专为手机设计的游戏平台,它允许在较低硬件配置的手机上运行高质量、流畅且互动性强的...

    JAVA编程常用英文单词汇总.doc

    在Java编程中,掌握一些常见的英文词汇至关重要,因为它们构成了我们理解和编写代码的基础。...在实际编程中,还会涉及更多高级概念和技术,如多线程、网络编程、设计模式等,这些都是构建复杂系统所必需的。

    C#(.NET)常用函数汇总

    以上只是C#中众多常用函数的一部分,实际编程过程中,还有很多其他功能强大的工具和方法,如反射、异步编程、多线程、正则表达式等。持续学习和熟练掌握这些函数,将有助于提升您的C#编程技能,并能更好地应对各种...

Global site tag (gtag.js) - Google Analytics