目录
什么是线程之间的通信
线程一旦开始运行,就会拥有自己独立的栈空间,那多个线程如何相互配合完成工作,这就涉及到了线程间的通信
线程之间的通信:是使线程间能够互相发送信号,使线程能够等待其他线程的信号。比如线程 A
在执行到某个条件时,通知线程 B
再执行某个操作,我们希望多个线程协同工作来完成某个任务
线程之间的通信如何实现
join()
需求说明:假设有 A,B,C
三个线程,要求三个线程分别依次
打印 1~3
三个数字。
针对这个需求,要求线程 A
执行完成后线程 B
才能开始执行,线程 B
执行完成之后线程 C
才能开始执行。对于 Thread
类中的 join()
方法熟悉的,肯定第一时间想到的就是用它来实现,它的作用:执行调用 join()
方法将挂起调用线程的执行任务,直到被调用的对象完成它的执行任务
关于 join()
方法详情:https://blog.csdn.net/weixin_38192427/article/details/120209512
public class JoinTest {
private static void printNumber(String threadName) {
for (int i = 1; i < 4; i++) {
System.out.println("线程" + threadName + ":" + i);
}
}
public static void main(String[] args) {
Thread A = new Thread(() -> {
printNumber("A");
});
Thread B = new Thread(() -> {
try {
A.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
printNumber("B");
}
});
Thread C = new Thread(() -> {
try {
B.join();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
printNumber("C");
}
});
A.start();
B.start();
C.start();
}
}
结果:
线程A:1
线程A:2
线程A:3
线程B:1
线程B:2
线程B:3
线程C:1
线程C:2
线程C:3
wait()
和 notify()
需求说明:线程 A
在打印完 1
后,再让 B
打印 1, 2, 3
,最后再回到 A
继续打印 2, 3
。分析:
- 线程
A
打印1
后,再让线程B
执行完成。不用说,在线程A
中应该执行调用锁对象的wait()
方法,它会自动释放对象持有的锁,并进入等待队列,等待线程B
的唤醒 - 线程
B
启动后,完成自己的任务之后。再去执行notify()
方法唤醒线程A
,让其执行它未完成的任务
public class waitAndNotify {
private static final Object object = new Object();
public static void main(String[] args) {
Thread B = new Thread(() -> {
synchronized (object) {
for (int i = 1; i < 4; i++) {
System