标题:Java线程阻塞等待及应用实例
引言
在多线程编程中,线程的状态和控制是非常重要的,尤其是线程的阻塞等待。线程阻塞等待是指线程暂时停止执行,直到满足特定条件才能继续执行。本文将介绍Java中线程阻塞等待的概念、使用方式以及一些常见的应用实例。
1. 线程阻塞等待的概念
线程的阻塞等待是指线程在执行过程中,通过调用某些方法使线程进入阻塞状态,等待特定条件满足后再继续执行。线程可以通过调用wait()
、join()
、sleep()
等方法来实现阻塞等待。
wait()
方法:使当前线程进入等待状态,直到其他线程调用该对象的notify()
或notifyAll()
方法才能被唤醒。join()
方法:使当前线程等待其他线程执行完毕后再继续执行。sleep()
方法:使当前线程进入休眠状态,暂停一段时间后再继续执行。
2. 线程阻塞等待的使用方式
2.1 使用wait()
和notify()
class MyThread implements Runnable {
public void run() {
synchronized(this) {
try {
// 线程进入等待状态
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread resumed");
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread();
Thread t1 = new Thread(thread);
t1.start();
Thread.sleep(2000); // 等待2秒
synchronized(thread) {
// 唤醒等待中的线程
thread.notify();
}
}
}
上述代码中,线程通过调用wait()
方法进入等待状态,当主线程等待2秒后调用notify()
方法唤醒等待中的线程。
2.2 使用join()
class MyThread extends Thread {
public void run() {
System.out.println("Thread started");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread completed");
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread();
thread.start();
thread.join(); // 等待线程执行完毕
System.out.println("Main thread completed");
}
}
上述代码中,主线程通过调用join()
方法等待子线程执行完毕后再继续执行。
2.3 使用sleep()
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Thread: " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread thread = new MyThread();
thread.start();
Thread.sleep(5000); // 等待子线程执行完毕
System.out.println("Main thread completed");
}
}
上述代码中,主线程通过调用sleep()
方法使自己进入休眠状态,暂停执行一段时间后再继续执行。
3. 线程阻塞等待的应用实例
3.1 生产者-消费者模型
生产者-消费者模型是一个经典的线程同步问题。在该模型中,生产者线程负责生产数据并将其放入缓冲区,而消费者线程则负责从缓冲区取出数据进行消费。当缓冲区为空时,消费者线程需要等待生产者线程生产数据;当缓冲区满时,生产者线程需要等待消费者线程消费数据。
下面是一个简单的生产者-消费者模型的示例