Java线程等待用法实例分析
在Java编程中,线程等待是掌握多线程知识的重要一环。当在某些情况下需要进行线程同步、控制程序执行顺序时,常常需要使用线程等待。本文将详细讲解Java线程等待的用法,并通过两个实例对其进行示例说明。
等待与通知
在线程中,等待与通知是两个相互关联的概念。等待指的是线程暂停自身的执行,并且进入等待状态,等待系统发出通知,来唤醒其继续执行。通知指的是在满足某些条件时,通知一个或多个正在等待状态中的线程继续执行。其中,等待和通知通过关键字synchronized
和wait
/notify
/notifyAll
来实现。
示例1:线程等待和通知基础示例
public class WaitNotifyExample {
public static void main(String[] args) throws InterruptedException {
final Object lock = new Object();
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 1 start to wait");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 is notified");
}
}).start();
Thread.sleep(2000);
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread 2 start to notify");
lock.notify();
}
}).start();
}
}
该示例中,两个线程互相协作。线程1在进入同步块后,首先输出等待信息,并在获得锁后调用lock.wait()
方法,使其进入等待状态。而线程2在两秒之后启动,首先获得锁后输出通知信息,接着调用lock.notify()
方法,唤醒处于等待状态中的线程1。
示例2:多线程协作的实例
public class WaitNotifyExample2 {
public static void main(String[] args) throws InterruptedException {
final Object lock = new Object();
int count = 5;
for (int i = 0; i < count; i++) {
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread " + Thread.currentThread().getId() + " start to wait");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + Thread.currentThread().getId() + " is notified");
}
}).start();
}
Thread.sleep(2000);
new Thread(() -> {
synchronized (lock) {
System.out.println("Thread " + Thread.currentThread().getId() + " start to notify");
lock.notifyAll();
}
}).start();
}
}
在该示例中,创建了5个线程,这些线程进入同一个锁区域,都会执行到等待代码块中,等待后通过锁机制通信,等待被唤醒。最后,线程2启动后,强制唤醒所有等待过的线程。
等待的使用注意事项
- 线程数量必须相符,即要等待的线程数量、要通知的线程数量都必须相等。
- 调用wait()方法前必须获得锁。
- 使用notify()方法必须得到锁,并且必须在同步块中使用。等待的线程继续执行时,会去尝试获取这个锁,只有获取锁后才能继续执行。
结论
Java中的各种线程等待用法,能够有效的帮助我们控制程序的运行顺序,优化其同步性。在实际编程中,时常会用到线程通信方式来满足业务功能的实现。本文主要介绍了Java线程等待在实际应用中的使用方法以及注意事项。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程等待用法实例分析 - Python技术站