wait、sleep 和 yield 方法(转)

本文详细介绍了Java中用于线程控制的三种方法:sleep、yield及join的使用方式及特点。通过具体示例展示了如何利用这些方法实现线程间的交互与同步,包括线程休眠、线程退让及等待线程完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
      }
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值