yield()和join()
yield()和join()都是Java中用于线程控制的方法。
yield()方法是让出CPU执行权,让线程重新回到就绪状态,让其他线程有机会获得CPU执行权。但是,调用yield()方法并不保证当前线程会立即停止执行,因为让出CPU执行权后,当前线程还有可能被重新调度执行。
join()方法是让当前线程等待调用该方法的线程执行完毕后再继续执行。如果调用join()方法的线程已经执行完毕,那么当前线程会立即继续执行。如果调用join()方法的线程还没有执行完毕,那么当前线程会被阻塞,直到调用join()方法的线程执行完毕。
下面是一个使用yield()和join()方法的示例代码:
public class YieldJoinDemo {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRunnable("A"));
Thread t2 = new Thread(new MyRunnable("B"));
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Main thread finished.");
}
static class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + ": " + i);
Thread.yield();
}
}
}
}
上面的代码创建了两个线程t1和t2,分别执行MyRunnable类中的run()方法。在run()方法中,每个线程都会输出自己的名字和一个数字,然后调用yield()方法让出CPU执行权。在main()方法中,首先启动t1和t2线程,然后调用它们的join()方法,等待它们执行完毕。最后输出一条信息表示主线程执行完毕。
运行上面的代码,输出结果如下:
A: 0
B: 0
A: 1
B: 1
A: 2
B: 2
A: 3
B: 3
A: 4
B: 4
Main thread finished.
可以看到,两个线程交替输出自己的名字和数字,而且每个线程都会让出CPU执行权,让另一个线程有机会执行。最后,主线程等待t1和t2线程执行完毕后再继续执行。