Java两个线程如何串行执行

在Java中,线程是一种轻量级的执行单元,可以同时执行多个线程来提高程序的执行效率。然而,有时候我们需要确保两个线程按照特定的顺序执行,即串行执行。本文将介绍如何使用Java的线程控制机制来实现两个线程的串行执行,并通过一个实际问题来演示。

实际问题描述

假设有一个餐厅,有两个厨师负责烹饪食物。第一个厨师负责准备食材,第二个厨师负责烹饪食物。他们需要按照以下步骤进行工作:

  1. 第一个厨师准备食材;
  2. 第一个厨师将食材交给第二个厨师;
  3. 第二个厨师烹饪食物。

需要注意的是,第一个厨师只能在第二个厨师完成当前任务后才能继续进行下一步。换句话说,第一个厨师必须等待第二个厨师完成当前任务才能继续。下面是如何使用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.");
    }
}

上述代码中,我们创建了两个Chef1Chef2类来模拟两个厨师的工作。Chef1类负责准备食材,Chef2类负责烹饪食物。使用synchronized关键字和wait()notify()方法来实现两个线程的串行执行。

Chef1run()方法中,首先获取锁对象lock的监视器锁,然后输出准备食材的信息,并通过Thread.sleep()方法模拟准备食材的时间。接下来,调用lock.notify()方法通知等待在该锁上的线程可以开始工作了。然后,调用lock.wait()方法使当前线程等待,直到被唤醒。

Chef2run()方法中,首先获取锁对象lock的监视器锁,然后调用lock.wait()方法使当前线程等待,直到