Java两个线程如何串行执行
在Java中,线程是一种轻量级的执行单元,可以同时执行多个线程来提高程序的执行效率。然而,有时候我们需要确保两个线程按照特定的顺序执行,即串行执行。本文将介绍如何使用Java的线程控制机制来实现两个线程的串行执行,并通过一个实际问题来演示。
实际问题描述
假设有一个餐厅,有两个厨师负责烹饪食物。第一个厨师负责准备食材,第二个厨师负责烹饪食物。他们需要按照以下步骤进行工作:
- 第一个厨师准备食材;
- 第一个厨师将食材交给第二个厨师;
- 第二个厨师烹饪食物。
需要注意的是,第一个厨师只能在第二个厨师完成当前任务后才能继续进行下一步。换句话说,第一个厨师必须等待第二个厨师完成当前任务才能继续。下面是如何使用Java的线程控制机制来解决这个问题。
代码示例
class Chef1 implements Runnable {
private final Object lock;
public Chef1(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
System.out.println("Chef 1 is preparing ingredients.");
try {
Thread.sleep(1000); // 模拟准备食材的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
// 通知第二个厨师可以开始工作了
lock.notify();
// 等待第二个厨师完成当前任务
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Chef 1 has finished his work.");
}
}
}
class Chef2 implements Runnable {
private final Object lock;
public Chef2(Object lock) {
this.lock = lock;
}
@Override
public void run() {
synchronized (lock) {
try {
// 等待第一个厨师准备食材
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Chef 2 is cooking the food.");
try {
Thread.sleep(2000); // 模拟烹饪食物的时间
} catch (InterruptedException e) {
e.printStackTrace();
}
// 通知第一个厨师可以继续工作了
lock.notify();
System.out.println("Chef 2 has finished his work.");
}
}
}
public class Main {
public static void main(String[] args) {
Object lock = new Object();
Thread chef1Thread = new Thread(new Chef1(lock));
Thread chef2Thread = new Thread(new Chef2(lock));
chef1Thread.start();
chef2Thread.start();
try {
chef1Thread.join();
chef2Thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The cooking process is completed.");
}
}
上述代码中,我们创建了两个Chef1
和Chef2
类来模拟两个厨师的工作。Chef1
类负责准备食材,Chef2
类负责烹饪食物。使用synchronized
关键字和wait()
、notify()
方法来实现两个线程的串行执行。
在Chef1
的run()
方法中,首先获取锁对象lock
的监视器锁,然后输出准备食材的信息,并通过Thread.sleep()
方法模拟准备食材的时间。接下来,调用lock.notify()
方法通知等待在该锁上的线程可以开始工作了。然后,调用lock.wait()
方法使当前线程等待,直到被唤醒。
在Chef2
的run()
方法中,首先获取锁对象lock
的监视器锁,然后调用lock.wait()
方法使当前线程等待,直到