线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。
在 Java 中,线程等待和通知的实现手段有以下几种方式:
为什么一个线程等待和通知机制就需要这么多的实现方式呢?别着急,咱们先来看实现,再来说原因。
Object 类的方法说明:
示例代码如下:
Object lock = new Object();
// 创建线程并执行
new Thread(() -> {
System.out.println("线程1:开始执行");
synchronized (lock) {
try {
System.out.println("线程1:进入等待");
lock.wait();
System.out.println("线程1:继续执行");
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("线程1:执行完成");
}
}).start();
Thread.sleep(1000);
synchronized (lock) {
// 唤醒线程
System.out.println("执行 notifyAll()");
lock.notifyAll();
}
Condition 类的方法说明:
示例代码如下:
// 创建 Condition 对象
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition(); // lock 下可创建多个 Condition
// 加锁
lock.lock();
try {
// 业务方法......
// 1.进入等待状态
condition.await();
// 2.唤醒操作
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
LockSupport 类的方法说明:
示例代码如下:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
LockSupport.park();
System.out.println("线程1");
}, "线程1");
t1.start();
Thread t2 = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("唤醒线程1");
LockSupport.unpark(t1);
}, "线程2");
t2.start();
}
为什么一个线程等待和唤醒的功能需要这么多的实现呢?
因为 Object 类诞生的比较早,也就是说 Condition 和 LockSupport 都是 JDK 后期版本才出现的功能,所以就有了现在这么多线程唤醒和等待的方法了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。