Java多线程--yield()、join()、sleep()方法

yield()

礼让线程,暂停线程 直接进入就绪状态不是阻塞状态作用是放弃当前CPU的资源,将资源让给其它线程但放弃的时间不确定,有可能刚刚放弃,又马上获得了CPU时间片

public class YieldTest {
	public static void main(String[] args) {
		MyYield my = new MyYield();
		new Thread(my,"a").start();
		new Thread(my,"b").start();
	}
}
class MyYield implements Runnable{
	public void run() {
		System.out.println(Thread.currentThread().getName()+"-->start");
		Thread.yield();
		System.out.println(Thread.currentThread().getName()+"-->end");
	}
}

第一种输出结果:

首先开启两个线程a和b,此时a抢夺到了CPU的执行权,执行run()方法,输出第一句start,当执行到Thread.yield()时,a线程暂停并且直接进入到就绪状态。此时b抢到了CPU的执行权,执行run()方法,输出第一句start,当执行到Thread.yield()时,暂停b线程并且直接进入就绪状态。a抢到执行权输出end,同理b。

在这里插入图片描述

第二种输出结果:

首先开启两个线程a和b,此时a抢夺到了CPU的执行权,执行run()方法,输出第一句start,当执行到Thread.yield()时,a线程暂停并且直接进入到就绪状态。此时a很幸运抢到了CPU的执行权,接着执行,输出end。b线程同理

在这里插入图片描述

join()

public class JoinTest {
	public static void main(String[] args) {
		new Thread(new Father()).start();
	}
}
//父亲类
class Father implements Runnable{
	public void run() {
		System.out.println("老爸想喝酒,发现没酒了");
		System.out.println("给钱给儿子,叫儿子去买酒");
		Thread t = new Thread(new Son());
		t.start();//开启儿子类线程
		try {
			//等待儿子买好酒...
			t.join();//调用者要等待被调用者执行完才可以执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("老爸接过了酒,还把余钱给了儿子");
	}
}

//儿子类
class Son implements Runnable{
	public void run() {
		System.out.println("儿子接了钱,去买酒了");
		System.out.println("看到了网吧,去玩了10s");
		for(int i=1;i<=10;i++) {
			System.out.println("玩了--"+i+"s了");
		}
		System.out.println("屁颠屁颠的跑去买酒");
		System.out.println("把酒给了老爸");
	}
}

输出结果:

在这里插入图片描述

sleep(毫秒值)

可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状态。

public class SleepTest02 {
	public static void main(String[] args) throws InterruptedException {
		int num = 10;
		while(num!=0) {
			Thread.sleep(1000);
			System.out.println(num--);
        }
	}
}

输出结果:

在这里插入图片描述

发布了22 篇原创文章 · 获赞 16 · 访问量 1615

猜你喜欢

转载自blog.csdn.net/qq_43098197/article/details/96868083