java多线程应用中常用的sleep、yield、join、wait、notify、notifyAll方法介绍

本文介绍了Java多线程编程中常用的方法,包括Thread.sleep()用于线程睡眠,不释放锁;Thread.yield()让当前线程暂停,给同等优先级的线程执行机会;Thread.join()使调用线程等待目标线程结束后再继续执行。

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

1)Thread.sleep()/sleep(long millis)

当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。 作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;


2)Thread.yield()


  让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行,如果没有同等优先权的线程,那么yield()方法将不会起作用。


3)thread.join()

    相当于把要调用join方法的线程也嵌套在当前的运行环境中,当前运行环境处于阻塞状态,直到调用join方法的线程执行完之后再继续往下执行!!
    例子:

/**
 * @编写人: yh.zeng
 * @编写时间:2017-1-18 下午5:01:06
 * @文件描述: todo
 */
class ThreadRunnable implements Runnable{
	private static int CIRCLE = 100;

	@Override
	public void run() {
		 System.out.println("进行线程:" + Thread.currentThread().getName());
         while(CIRCLE >= 0){
        	 System.out.println("线程" + Thread.currentThread().getName() + "正在打印信息CIRCLE=" + CIRCLE);
        	 CIRCLE --;
         }
         System.out.println("退出线程:" + Thread.currentThread().getName());
	}
	
}

public class ThreadJoinTest {
    public static void main(String args[]) throws InterruptedException{
		System.out.println("进入主线程" + Thread.currentThread().getName());
		Thread thread1 = new Thread(new ThreadRunnable());
		thread1.start();
		thread1.join();
		System.out.println("退出主线程" + Thread.currentThread().getName());
    }
}


主线程main 在执行了thread1.join(); 代码之后,就一直处于阻塞状态,直到线程thread1执行完毕之后,才继续执行下一行代码!!

执行效果:

进入主线程main
进行线程:Thread-0
线程Thread-0正在打印信息CIRCLE=100
线程Thread-0正在打印信息CIRCLE=99
线程Thread-0正在打印信息CIRCLE=98
线程Thread-0正在打印信息CIRCLE=97
线程Thread-0正在打印信息CIRCLE=96
线程Thread-0正在打印信息CIRCLE=95
线程Thread-0正在打印信息CIRCLE=94
线程Thread-0正在打印信息CIRCLE=93
线程Thread-0正在打印信息CIRCLE=92
线程Thread-0正在打印信息CIRCLE=91
线程Thread-0正在打印信息CIRCLE=90
线程Thread-0正在打印信息CIRCLE=89
线程Thread-0正在打印信息CIRCLE=88
线程Thread-0正在打印信息CIRCLE=87
线程Thread-0正在打印信息CIRCLE=86
线程Thread-0正在打印信息CIRCLE=85
线程Thread-0正在打印信息CIRCLE=84
线程Thread-0正在打印信息CIRCLE=83
线程Thread-0正在打印信息CIRCLE=82
线程Thread-0正在打印信息CIRCLE=81
线程Thread-0正在打印信息CIRCLE=80
线程Thread-0正在打印信息CIRCLE=79
线程Thread-0正在打印信息CIRCLE=78
线程Thread-0正在打印信息CIRCLE=77
线程Thread-0正在打印信息CIRCLE=76
线程Thread-0正在打印信息CIRCLE=75
线程Thread-0正在打印信息CIRCLE=74
线程Thread-0正在打印信息CIRCLE=73
线程Thread-0正在打印信息CIRCLE=72
线程Thread-0正在打印信息CIRCLE=71
线程Thread-0正在打印信息CIRCLE=70
线程Thread-0正在打印信息CIRCLE=69
线程Thread-0正在打印信息CIRCLE=68
线程Thread-0正在打印信息CIRCLE=67
线程Thread-0正在打印信息CIRCLE=66
线程Thread-0正在打印信息CIRCLE=65
线程Thread-0正在打印信息CIRCLE=64
线程Thread-0正在打印信息CIRCLE=63
线程Thread-0正在打印信息CIRCLE=62
线程Thread-0正在打印信息CIRCLE=61
线程Thread-0正在打印信息CIRCLE=60
线程Thread-0正在打印信息CIRCLE=59
线程Thread-0正在打印信息CIRCLE=58
线程Thread-0正在打印信息CIRCLE=57
线程Thread-0正在打印信息CIRCLE=56
线程Thread-0正在打印信息CIRCLE=55
线程Thread-0正在打印信息CIRCLE=54
线程Thread-0正在打印信息CIRCLE=53
线程Thread-0正在打印信息CIRCLE=52
线程Thread-0正在打印信息CIRCLE=51
线程Thread-0正在打印信息CIRCLE=50
线程Thread-0正在打印信息CIRCLE=49
线程Thread-0正在打印信息CIRCLE=48
线程Thread-0正在打印信息CIRCLE=47
线程Thread-0正在打印信息CIRCLE=46
线程Thread-0正在打印信息CIRCLE=45
线程Thread-0正在打印信息CIRCLE=44
线程Thread-0正在打印信息CIRCLE=43
线程Thread-0正在打印信息CIRCLE=42
线程Thread-0正在打印信息CIRCLE=41
线程Thread-0正在打印信息CIRCLE=40
线程Thread-0正在打印信息CIRCLE=39
线程Thread-0正在打印信息CIRCLE=38
线程Thread-0正在打印信息CIRCLE=37
线程Thread-0正在打印信息CIRCLE=36
线程Thread-0正在打印信息CIRCLE=35
线程Thread-0正在打印信息CIRCLE=34
线程Thread-0正在打印信息CIRCLE=33
线程Thread-0正在打印信息CIRCLE=32
线程Thread-0正在打印信息CIRCLE=31
线程Thread-0正在打印信息CIRCLE=30
线程Thread-0正在打印信息CIRCLE=29
线程Thread-0正在打印信息CIRCLE=28
线程Thread-0正在打印信息CIRCLE=27
线程Thread-0正在打印信息CIRCLE=26
线程Thread-0正在打印信息CIRCLE=25
线程Thread-0正在打印信息CIRCLE=24
线程Thread-0正在打印信息CIRCLE=23
线程Thread-0正在打印信息CIRCLE=22
线程Thread-0正在打印信息CIRCLE=21
线程Thread-0正在打印信息CIRCLE=20
线程Thread-0正在打印信息CIRCLE=19
线程Thread-0正在打印信息CIRCLE=18
线程Thread-0正在打印信息CIRCLE=17
线程Thread-0正在打印信息CIRCLE=16
线程Thread-0正在打印信息CIRCLE=15
线程Thread-0正在打印信息CIRCLE=14
线程Thread-0正在打印信息CIRCLE=13
线程Thread-0正在打印信息CIRCLE=12
线程Thread-0正在打印信息CIRCLE=11
线程Thread-0正在打印信息CIRCLE=10
线程Thread-0正在打印信息CIRCLE=9
线程Thread-0正在打印信息CIRCLE=8
线程Thread-0正在打印信息CIRCLE=7
线程Thread-0正在打印信息CIRCLE=6
线程Thread-0正在打印信息CIRCLE=5
线程Thread-0正在打印信息CIRCLE=4
线程Thread-0正在打印信息CIRCLE=3
线程Thread-0正在打印信息CIRCLE=2
线程Thread-0正在打印信息CIRCLE=1
线程Thread-0正在打印信息CIRCLE=0
退出线程:Thread-0
退出主线程main


4)object.wait()


  当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。


5)object.notify()/notifyAll()


  唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值