`
jiaguwen123
  • 浏览: 414123 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中的函数yield(),sleep()和wait()的区别

    博客分类:
  • view
阅读更多

首先,wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法。

(1).常用的wait方法有wait()和wait(long timeout):
    void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
    void wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
    wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
    wait()和notify()因为会对对象的“锁标志”进行操作,所以它们必须在synchronized函数或synchronized  block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

(2).Thread.sleep(long millis),必须带有一个时间参数。
    sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;
    sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会;
    sleep(long)是不会释放锁标志的。

(3).yield()没有参数。
    sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出CPU占有权,但让出的时间是不可设定的。
    yield()也不会释放锁标志。

    实际上,yield()方法对应了如下操作: 先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU 的占有权交给此线程,否则继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程。

    sleep方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程些时获得CPU占有权。 在一个运行系统中,如果较高优先级的线程没有调用 sleep 方法,又没有受到 I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,才有机会运行。

    yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。所以yield()只能使同优先级的线程有执行的机会。

分享到:
评论
1 楼 sornor 2011-07-20  
总结的不错哟!

相关推荐

    java中yieldsleep以及wait的区别.pdf

    Java中的多线程编程涉及到许多关键概念,包括`yield()`, `sleep()`, 和 `wait()`,这些都是控制线程执行的重要方法。理解它们的区别对于编写高效并发程序至关重要。 首先,`yield()`方法的作用是让当前正在执行的...

    java多线程Demo

    在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...

    JAVA面试题.doc

    11. Java 中的多线程可以使用 sleep()、suspend()、wait()、yield() 等方法来控制线程的执行。 八、 Log4j 12. Log4j 是一个 Java 日志框架,提供了日志记录和输出功能。Log4j 的优先级从高到低的排序是 error>...

    java最新多线程编程

    本文将详细讨论`yield()`, `sleep()`, 和`wait()`这三个与线程控制密切相关的函数,以及它们之间的区别。 首先,`yield()`方法是让当前线程主动放弃CPU执行权,将其放回到就绪队列的尾部,但并不保证立即执行其他...

    Java线程.ppt

    `sleep()`方法让线程进入堵塞状态,`join()`方法等待线程执行完成,`yield()`方法让当前线程让出CPU,`stop()`方法停止线程(不推荐使用,因为可能引起数据不一致),`interrupt()`方法中断线程,以及`wait()`和`...

    Java线程学习和总结

    Java提供了一些方法来控制线程状态,如`sleep()`使线程暂停执行一段时间,`join()`等待指定线程结束,`yield()`让当前线程暂停,让其他相同优先级的线程有机会执行,`interrupt()`用于中断线程。 同步是Java线程...

    JAVA 线程中启动线程

    本篇文章将详细探讨如何在Java中启动线程,以及相关的重要概念和技术。 1. **线程创建方式** - **实现Runnable接口**:这是最常见的创建线程的方式,只需创建一个类实现`Runnable`接口,然后在`run()`方法中编写...

    Java高并发编程详解:多线程与架构设计 (Java核心技术系列)

    接着,详细讲解了`Thread`类的构造函数和API,如`sleep()`、`yield()`、`join()`、`interrupt()`等,以及如何使用`synchronized`关键字实现数据同步,避免数据竞争和死锁。此外,还介绍了线程间的通信机制,如`wait...

    深入浅出 Java 多线程.pdf_java_

    Java提供了多种线程控制机制,如sleep()方法让线程进入阻塞状态,yield()方法让当前线程暂停,让其他线程有机会运行,join()方法让一个线程等待另一个线程完成,以及synchronized关键字用于线程同步,防止数据竞争...

    JAVA多线程(精典总结)

    线程调度在Java中采用抢占式调度模型,即线程的执行权可能在任何时刻被其他高优先级线程抢占。Java虚拟机提供了`Thread.sleep()`,`Thread.yield()`和`Thread.join()`等方法来影响线程调度。`sleep()`使当前线程进入...

    java中的线程使用.pdf

    Java中的线程使用主要涉及到java.lang.Thread类和java.lang.Runnable接口。 Thread类是实现线程的直接方式,它实现了Runnable接口。开发者可以通过继承Thread类并重写其run方法来定义线程要执行的任务。一旦创建...

    Java高级教程课件 java数据库教程 JDBC教程 5-java-thread(1)线程(共18页).pptx

    在Java中,多线程技术是另一个核心概念,它使得程序能够同时执行多个任务,提高系统资源的利用率。线程是进程内的单一执行流,相对于进程,线程具有更低的开销,因为它们共享同一地址空间,这减少了内存占用并简化了...

    java多线程源码-source

    在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。接下来,我们将深入探讨这两个方法以及相关的知识点。 1. 继承Thread类 当一个类继承了Thread类,它就自动成为一个线程类。你需要重写...

    java线程文档大全

    在Java中,线程是通过Java.lang.Thread类或实现Runnable接口来创建和管理的。这份“java线程文档大全”包含了关于Java线程的广泛知识,以下是其中的一些关键点: 1. **线程概念**:线程是程序执行的最小单位,每个...

    java_Thread.rar_java 多线程_java多线程

    在Java中,通过实现Runnable接口或者继承Thread类可以创建并运行多线程。本资料"java_Thread.rar"提供了一些Java多线程的实践案例,对于深入理解和应用Java多线程技术具有很高的参考价值。 首先,我们要理解线程的...

    java高并发1

    本文将详细探讨并发和并行的区别,线程的实现与管理,以及Java中用于并发控制的关键机制和工具。 首先,了解并发和并行的基本概念。并行是指多个CPU实例或多台机器同时执行任务,实现真正的同步执行。而并发则是...

    JAVA高级程序设计测试题含答案.docx

    1. **输入/输出流**:在Java中,读取字符文字推荐使用`FileReader`,因为它是一个字符流类,适用于处理文本数据。`FileWriter`用于写入文件,`FileInputStream`和`ObjectInputStream`分别用于字节流和对象的序列化...

    java多线程编程大总结

    2. Java中的线程:在Java中,线程可以通过两种方式创建:扩展java.lang.Thread类并重写run方法,或者实现java.lang.Runnable接口并传递给Thread类的构造函数。无论哪种方式,最终都是通过Thread类的start方法来启动...

    java笔记,上课笔记

    Java中可以通过ExecutorService和ThreadPoolExecutor来创建和管理线程池。 17. **UDP编程**: - DatagramSocket和DatagramPacket用于UDP(无连接)网络编程,适用于一次性传输少量数据的场景。 以上内容仅涵盖了...

    java线程实例 各种小Demo

    在Java中,线程可以分为用户线程和守护线程,前者是程序运行的基础,而后者是在所有用户线程结束时才终止的后台服务。 一、线程的创建方式 Java提供了多种创建线程的方式: 1. 继承Thread类:创建一个新的类,继承...

Global site tag (gtag.js) - Google Analytics