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--);
}
}
}
输出结果: