`
369128396
  • 浏览: 84585 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

wait、sleep 和 yield 方法(转)

    博客分类:
  • java
阅读更多

wait是Object类的方法,sleep与yield都是Thread类的方法。wait调用的时候需要注意的是该方法是释放锁标志的,而sleep在调用的时候是紧紧抱着锁标志的,也就是等他完全执行完成了才可以让其他线程来访问的

sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作: 先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把 CPU 的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退让”,它把运行机会让给了同等优先级的其他线程。

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

 

 

 

1.sleep
static void sleep(long millis) 
sleep方法是静态方法,说明类Thread可以调用。
sleep举例:
import java.util.*;
public class TestInterrupt {
 
public static void main(String[] args) {
    MyThread thread
= new MyThread();
    thread.start();                         
   
try {Thread.sleep(10000);}    //主线程睡10秒。
    catch (InterruptedException e) {}
    thread.interrupt();
  }
}

class MyThread extends Thread {
boolean flag = true;
 
public void run(){
   
while(flag){
      System.out.println(
"==="+new Date()+"===");
     
try {
        sleep(
1000);
      }
catch (InterruptedException e) {
       
return;
      }
    }
  }
}

2.join可并某个线程
public class TestJoin {
 
public static void main(String[] args) {
    MyThread2 t1
= new MyThread2("abcde");
    t1.start();
   
try {
     t1.join();                                      
//本来运行完t1.start之后,就会出现主线程和t1线程并行的运行。
    } catch (InterruptedException e) {}//但是join后,t1线程合并到主线程,主线程等t1运行完后再运行。
    
   
for(int i=1;i<=10;i++){
      System.out.println(
"i am main thread");
    }
  }
}
class MyThread2 extends Thread {
  MyThread2(String s){
  
super(s);
  }
 
 
public void run(){
   
for(int i =1;i<=10;i++){
      System.out.println(
"i am "+getName());
     
try {
       sleep(
1000);
      }
catch (InterruptedException e) {
      
return;
      }
    }
  }
}


3.yield方法
让出CPU,给其他线程运行的机会。

public class TestYield {
 
public static void main(String[] args) {
    MyThread3 t1
= new MyThread3("t1");
    MyThread3 t2
= new MyThread3("t2");
    t1.start(); t2.start();
  }
}
class MyThread3 extends Thread {
  MyThread3(String s){
super(s);}
 
public void run(){
   
for(int i =1;i<=100;i++){
      System.out.println(getName()
+": "+i);
     
if(i%10==0){
        yield();
      }
    }
  }
}

分享到:
评论

相关推荐

    多线程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线程中wait,await,sleep,yield,join用法总结.pdf

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

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

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

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

    本资源主要讲解了Java中四个常用的线程控制方法:sleep()、yield()、join()和wait(),它们是Java多线程编程中的重要组成部分。下面是对每个方法的详细讲解: 1. sleep()方法: sleep()方法是Thread类...

    java中yieldsleep以及wait的区别.pdf

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

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

    本文将详细解析Java中的线程让步方法`yield()`以及线程休眠方法`sleep()`,并与线程等待的`wait()`方法进行对比。 首先,线程让步`yield()`方法的主要作用是让当前线程主动放弃执行权,让其他处于就绪状态且具有...

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

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

    java最新多线程编程

    总结来说,`yield()`、`sleep()`和`wait()`都是Java中控制线程行为的关键方法。`yield()`用于短暂让出CPU,`sleep()`用于临时挂起线程,`wait()`用于线程间的同步和通信。正确理解和使用这些方法对于编写高效、可靠...

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

    在IT领域,尤其是在Java编程中,多线程是不可或缺的一部分,尤其对于开发高效并发应用程序至关重要。今天我们将深入探讨由IT十八掌徐培成讲解的Java...理解并熟练掌握这些概念和方法,对于编写高效的并发程序至关重要。

    Java高级面试题及答案汇总(2021年Java面试题答案大全)

    10. 线程的 sleep() 方法和 yield() 方法有什么区别: * sleep() 方法给其他线程运行机会时不考虑线程的优先级 * yield() 方法只会给相同优先级或更高优先级的线程以运行的机会 *sleep() 方法声明抛出 ...

    线程的几个重要方法.doc

    这些方法必须在同步块或同步方法中使用,以防止竞态条件和死锁的发生。 在实际编程中,理解并熟练掌握这些线程方法对于编写高效的并发程序至关重要。例如,`synchronized`关键字用于保证共享数据的线程安全性,避免...

    多线程控制方法

    本文将深入探讨四个重要的线程控制方法:`start()`、`sleep()`、`join()` 和 `yield()`,以及它们在实际应用中的作用。 首先,`start()` 方法是启动线程的核心方法。当创建一个 `Thread` 类的实例或其子类时,线程...

    java多线程.pdf

    由于wait、notify和notifyAll方法必须在synchronized方法或代码块中调用,因此这些方法必须与synchronized关键字配合使用。 Thread类提供了一些方法来控制线程的执行。例如,sleep方法让当前线程暂停执行指定的时间...

    JAVA多线程操作方法实用大全

    `wait()`、`notify()`和`notifyAll()`方法是与对象监视器相关的,它们通常与`synchronized`关键字配合使用。在同步块中,`wait()`使当前线程进入对象的等待池,等待其他线程唤醒。`notify()`唤醒等待池中的一个线程...

    Java 线程详解

    在 Java 中,线程的通信可以通过 wait、notify 和 notifyAll 方法实现。wait 方法可以让线程等待某个事件的发生,notify 方法可以唤醒等待的线程,而 notifyAll 方法可以唤醒所有等待的线程。 在 Java 中,线程的...

    J2SE_5.0_第07章_容器1.rar

    5. **线程同步**:如何通过synchronized关键字、wait()、notify()和notifyAll()方法实现线程间的同步,防止数据竞争问题。 6. **死锁**:线程同步不当可能导致死锁,即两个或更多线程相互等待对方释放资源,形成僵局...

    7Java第七单元练习题-Java多线程机制.pdf

    在探讨Java多线程机制的知识点之前,我们应当明确,Java中的多线程是通过实现`java.lang.Runnable`接口或继承`java.lang...在实际编程中,正确理解和使用这些概念和方法对于开发高效、稳定、多线程的应用程序至关重要。

    java线程分析android project例子

    本文将深入探讨在Android项目中如何使用Java线程,并基于`TestThread`这个示例来解析`sleep()`, `join()`, `yield()`, `wait()`, `notify()`等线程控制方法以及相关注意事项。 首先,我们来看`sleep()`方法。它允许...

    java线程学习资料

    - 继承`Thread`类可以更直接地访问线程的属性和方法,但Java不支持多重继承,因此如果需要继承其他类,这种方式就不太适用。 - 实现`Runnable`接口可以避免上述问题,并且更易于实现资源共享,因为多个线程可以...

Global site tag (gtag.js) - Google Analytics