`
nada_forever
  • 浏览: 24941 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【转】yield和sleep的区别

阅读更多

JDK1.5.0的API文档里的描述:

yield:Causes the currently executing thread object to temporarily pause and allow other threads to execute.

sleep:Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds.

根本无助于理解两者间的差别

线程的生命周期里有三个状态Runable、Blocked、Running

yield:Running  ->  Runable

sleep: Running -> Blocked -> Runable

yield和sleep都是在线程处于Running的时候开始的,yield只是让出分配给自己的CPU时间片,并且会立刻进入Runable状态参与CPU时间的竞争,若程序中没有其他线程,那么该线程马上就会开始往下执行;sleep会进入Blocked状态,等待时间结束事件的发生,然后进入Runable状态参与CPU时间的竞争

另外,sleep和yield都不具备同步语义,也就是说编译器在执行sleep或yield方法之前和之后,都没有强制要求同步本地缓存与主存的数据

以下摘自JSL3.0

It is important to note that neither Thread.sleep nor Thread.yield have

any synchronization semantics. In particular, the compiler does not have to flush

writes cached in registers out to shared memory before a call to Thread.sleep or

Thread.yield, nor does the compiler have to reload values cached in registers

after a call to Thread.sleep or Thread.yield.

For example, in the following (broken) code fragment, assume that this.done is a non-volatile

boolean field:

 

  1. while (!this.done)  
  2.     Thread.sleep(1000);  
 

 

The compiler is free to read the field this.done just once, and reuse the cached value

in each execution of the loop. This would mean that the loop would never terminate, even if

another thread changed the value of this.done.

 

原文地址:http://blog.csdn.net/kingquake21/archive/2011/01/24/6160952.aspx

分享到:
评论

相关推荐

    多线程sleep,yield,wait区别

    `sleep`, `yield`, 和 `wait` 是 Java 中用于线程管理的三个重要方法,它们各自有着不同的功能和用途。理解它们的区别有助于编写出更加高效和可控的多线程程序。 1. **sleep() 方法** - `Thread.sleep(millisecond...

    sleep()、wait()、yield()和join()方法特点及区别.docx

    本文将深入探讨Java中的四个关键方法:`sleep()`, `wait()`, `yield()`和`join()`,以及它们各自的特点和区别。 首先,我们来看`sleep()`和`wait()`的区别: 1. **来源不同**:`sleep()`是`Thread`类的方法,它...

    java中yieldsleep以及wait的区别.pdf

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

    线程中sleep、join、yield、wait的区别

    本文将详细解析线程中`sleep()`, `join()`, `yield()`, 和 `wait()` 四个方法的区别。 1. `sleep()` `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它允许当前正在执行的线程在指定的毫秒数内暂停执行。...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    本文将总结五个关键的线程控制方法:wait()、await()、sleep()、yield()和join()。这些方法各自有独特的用途和不同的工作机制。 一、wait()、notify()、notifyAll()用法 wait()、notify()和notifyAll()是Object类...

    T03-Sleep-Yield-Join.java

    T03_Sleep_Yield_Join.java

    高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别.pdf,这是一份不错的文件

    "高薪程序员面试题精讲系列63之说说sleep()、yield()、join()、wait()的区别" 本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要...

    Java sleep方法及中断方式、yield方法代码实例

    在Java多线程编程中,`Thread.sleep()`、中断机制以及`Thread.yield()`方法都是控制线程行为的重要工具。接下来我们将深入探讨这三个知识点,并通过示例代码来展示它们的实际应用。 一、`Thread.sleep()`方法 `...

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法(礼让)、join方法(合并)、interrupt()方法(中断),线程的生命周期 线程 与 进程 的关系:**有一个进程中至少包含一个线程 **...

    Java线程中yield与join方法的区别

    之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。  Java线程调度...

    pintos timer_sleep

    原版的`timer_sleep`函数采用了忙等待的方式,在这种方式下,线程会不断检查当前时间并调用`thread_yield()`直到达到预定的睡眠时间。这种方法虽然简单直接,但会消耗大量CPU资源,降低系统效率。 **实现细节** ...

    详解Java中的线程让步yield()与线程休眠sleep()方法

    `yield()`和`wait()`的一个主要区别在于,`yield()`仅将线程状态从运行变为就绪,而不涉及同步锁的释放;而`wait()`则会让线程进入等待状态并释放锁,以便其他线程能够获得锁并执行同步代码。 线程休眠`sleep()`...

    Java线程让步yield用法实例分析

    yield()方法是一个和sleep()方法有点类似的方法,它是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是让线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程...

    【IT十八掌徐培成】Java基础第08天-01.多线程-yield.zip

    需要注意的是,`yield()`并不会像`sleep()`或`join()`那样使线程进入等待状态,而是让线程回到可运行状态,这意味着线程仍然可以随时被调度执行。 使用`yield()`的主要目的是提高线程的公平性,尤其是当有多个线程...

    Python 中由 yield 实现异步操作

    通过上述分析我们可以看到,`yield` 和 `asyncio` 提供了强大的工具来实现异步操作。无论是简单的数据生产和消费场景还是复杂的多任务并发环境,这些工具都能够帮助开发者更加高效地编写出高性能的代码。

    安卓面试习题及答案

    `start()` 和 `run()` 方法的区别在于 `start()` 方法会使得线程进入就绪状态,等待CPU调度,而 `run()` 方法则是在调用它的线程中直接执行该方法的内容。在安卓开发中,合理管理线程对于提升应用性能和用户体验至关...

    javascript 使用sleep函数的常见方法详解

    但在JavaScript的单线程模型中,直接使用`sleep`会导致整个浏览器或Node.js应用变得无响应,因为它会阻止事件循环处理其他任务,包括用户交互和UI更新。 二、为何需要`sleep`函数? 在JavaScript中,通常使用`...

    07 深入Thread类—线程API精讲.pdf

    本小结主要探讨`Thread`类的`sleep`和`yield`方法。 1. `sleep`方法: `Thread.sleep(long millis)`和`Thread.sleep(long millis, int nanos)`这两个方法用于使当前线程进入休眠状态,不释放任何锁资源。休眠时间...

    java最新多线程编程

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

    详解Python3中yield生成器的用法

    #### 七、yield与return的区别 在生成器函数中,`return` 语句可以用来提前结束生成器。一旦执行了 `return`,生成器就会被关闭。与之相对的是,`yield` 语句可以返回一个值,但不会结束生成器,而是暂停执行,等待...

Global site tag (gtag.js) - Google Analytics