-
yield
:线程的礼让。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定礼让成功。 -
join
:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务。
- 案例:
main
线程创建一个子线程,每隔1
秒输出hello
,输出20
次,主线程每隔1
秒,输出hi
,输出20
次。要求:两个线程同时执行,当主线程输出5
次后,就让子线程运行完毕,主线程再继续。
public class ThreadMethod02 {
public static void main(String[] args) throws InterruptedException {
T3 t3 = new T3();
t3.start();
for(int i = 1; i <= 20; i++) {
Thread.sleep(1000);
System.out.println("主线程(小弟) 吃了 " + i + " 包子");
if(i == 5) {
System.out.println("主线程(小弟) 让 子线程(老大) 先吃");
//join, 线程插队
t3.join();// 这里相当于让t2 线程先执行完毕
// Thread.yield();//礼让,不一定成功..
System.out.println("子线程(老大) 吃完了 主线程(小弟) 接着吃..");
}
}
}
}
class T3 extends Thread {
@Override
public void run() {
for (int i = 1; i <= 20; i++) {
try {
Thread.sleep(1000);//休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程(老大) 吃了 " + i + " 包子");
}
}
}
-
如果把上面的
join
改为yield
,就不一定礼让成功了 -
可以看到还是会一起执行
-
案例演示
- 主线程每隔
1s
,输出hi
,一共10
次 - 当主线程输出到
hi 5
时,启动一个子线程(要求实现Runnable
),每隔1s
输出hello
,等该线程输出10
次hello
后,退出 - 主线程继续输出
hi
,直到主线程退出。 - 如图,线程插队
public class ThreadMethodExercise {
public static void main(String[] args) throws InterruptedException {
Thread t4 = new Thread(new T4());//创建子线程
for (int i = 1; i <= 10; i++) {
System.out.println("hi " + i);
if(i == 5) {//说明主线程输出了5次 hi
t4.start();//启动子线程 输出 hello...
t4.join();//立即将t4子线程,插入到main线程,让t4先执行
}
Thread.sleep(1000);//输出一次 hi, 让main线程也休眠1s
}
System.out.println("主线程结束...");
}
}
class T4 implements Runnable {
private int count = 0;
@Override
public void run() {
while (true) {
System.out.println("hello " + (++count));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count == 10) {
System.out.println("子线程结束...");
break;
}
}
}
}