一、join
在线程t2的代码中加入t1.join(),就是让t1这个线程先运行完,让t2这个线程暂时挂起不运行
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("线程1开始运行!");
for (int i = 0; i < 50; i++) {
System.out.println("1打印:"+i);
}
System.out.println("线程1结束!");
});
Thread t2 = new Thread(() -> {
System.out.println("线程2开始运行!");
for (int i = 0; i < 50; i++) {
System.out.println("2打印:"+i);
if(i == 10){
try {
System.out.println("线程1加入到此线程!");
t1.join(); //在i==10时,让线程1加入,先完成线程1的内容,在继续当前内容
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
运行结果如下:
线程1开始运行!
线程2开始运行!
2打印:0
1打印:0
2打印:1
1打印:1
2打印:2
1打印:2
2打印:3
1打印:3
2打印:4
1打印:4
2打印:5
1打印:5
2打印:6
1打印:6
2打印:7
1打印:7
1打印:8
1打印:9
1打印:10
2打印:8
1打印:11
2打印:9
1打印:12
2打印:10
线程1加入到此线程!
1打印:13
1打印:14
1打印:15
1打印:16
1打印:17
1打印:18
1打印:19
1打印:20
1打印:21
1打印:22
1打印:23
1打印:24
1打印:25
1打印:26
1打印:27
1打印:28
1打印:29
1打印:30
1打印:31
1打印:32
1打印:33
1打印:34
1打印:35
1打印:36
1打印:37
1打印:38
1打印:39
1打印:40
1打印:41
1打印:42
1打印:43
1打印:44
1打印:45
1打印:46
1打印:47
1打印:48
1打印:49
线程1结束!
2打印:11
2打印:12
2打印:13
2打印:14
2打印:15
2打印:16
2打印:17
2打印:18
2打印:19
2打印:20
2打印:21
2打印:22
2打印:23
2打印:24
2打印:25
2打印:26
2打印:27
2打印:28
2打印:29
2打印:30
2打印:31
2打印:32
2打印:33
2打印:34
2打印:35
2打印:36
2打印:37
2打印:38
2打印:39
2打印:40
2打印:41
2打印:42
2打印:43
2打印:44
2打印:45
2打印:46
2打印:47
2打印:48
2打印:49
需要注意的是,在t1未加入到t2的时候,这两个线程是并发执行,而执行到t1.join时,就让t1这个线程先运行完毕,此时只剩t2这个线程,执行完毕,程序结束
二、yield
yield是将当前线程的cpu时间块让给其他线程(注意,虽然这个线程让出了自己的时间块,但是有可能该线程会被再次选中),引用他人博客的解释,就是:让出当前线程CPU的时间片,使当前线程从执行状态变为就绪状态,cpu将会从就绪队列中重新选择一个线程,也就是说,当前线程还是有可能会被再次选择的。
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
System.out.println("线程1开始运行!");
for (int i = 0; i < 50; i++) {
if(i % 5 == 0) {
System.out.println("让位!");
Thread.yield();
}
System.out.println("1打印:"+i);
}
System.out.println("线程1结束!");
});
Thread t2 = new Thread(() -> {
System.out.println("线程2开始运行!");
for (int i = 0; i < 50; i++) {
System.out.println("2打印:"+i);
}
});
t1.start();
t2.start();
}
输出结果如下:
线程1开始运行!
让位!
线程2开始运行!
1打印:0
1打印:1
1打印:2
1打印:3
1打印:4
让位!
1打印:5
1打印:6
1打印:7
1打印:8
1打印:9
让位!
1打印:10
1打印:11
1打印:12
1打印:13
1打印:14
让位!
1打印:15
1打印:16
2打印:0
2打印:1
2打印:2
2打印:3
2打印:4
1打印:17
2打印:5
1打印:18
2打印:6
1打印:19
让位!
2打印:7
1打印:20
2打印:8
2打印:9
1打印:21
2打印:10
1打印:22
2打印:11
1打印:23
2打印:12
1打印:24
让位!
2打印:13
1打印:25
2打印:14
1打印:26
2打印:15
1打印:27
2打印:16
1打印:28
2打印:17
1打印:29
让位!
2打印:18
1打印:30
2打印:19
1打印:31
1打印:32
2打印:20
1打印:33
2打印:21
1打印:34
让位!
2打印:22
2打印:23
2打印:24
2打印:25
2打印:26
2打印:27
2打印:28
2打印:29
2打印:30
2打印:31
2打印:32
2打印:33
2打印:34
2打印:35
2打印:36
2打印:37
2打印:38
2打印:39
2打印:40
2打印:41
2打印:42
2打印:43
2打印:44
2打印:45
2打印:46
2打印:47
2打印:48
2打印:49
1打印:35
1打印:36
1打印:37
1打印:38
1打印:39
让位!
1打印:40
1打印:41
1打印:42
1打印:43
1打印:44
让位!
1打印:45
1打印:46
1打印:47
1打印:48
1打印:49
线程1结束!
三、总结
join: 挂起当前线程,让t1.join()这个t1线程先运行结束
yield:本来到这个线程执行了,但是执行了Thread.yield(),就让这个占用cpu的线程处于就绪态,让系统重新选择一个线程占用cpu