在多线程编程中,线程间的同步是一个关键问题。当需要多个线程按照一定的顺序执行时,可以使用 notify 方法来实现线程间的通信和同步。下面,我将详细解释如何使用 notify 方法让多个线程按顺序工作。
基本概念
在 Java 中,每个线程都有一个锁(Lock),当线程访问共享资源时,它会尝试获取这个锁。如果锁已被其他线程占用,则当前线程会等待直到锁被释放。
notify 方法是 Object 类中的一个方法,用于唤醒一个在当前对象上等待的线程。被唤醒的线程将进入可运行状态,等待下一次获得锁的机会。
实现步骤
以下是一个简单的示例,展示了如何使用 notify 方法让多个线程按顺序工作:
1. 创建线程类
首先,我们需要创建一个线程类,该类实现了 Runnable 接口。在这个类中,我们将使用 synchronized 关键字来标识需要同步的方法。
public class Worker implements Runnable {
private static final Object lock = new Object();
private static int currentWorker = 0;
@Override
public void run() {
synchronized (lock) {
while (currentWorker != Thread.currentThread().getId()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 执行任务
System.out.println(Thread.currentThread().getName() + " is working.");
currentWorker++;
lock.notifyAll();
}
}
}
2. 创建线程并启动
接下来,我们创建三个线程,并将它们设置为 Worker 类的实例。然后,我们启动这些线程。
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(new Worker(), "Worker 1");
Thread t2 = new Thread(new Worker(), "Worker 2");
Thread t3 = new Thread(new Worker(), "Worker 3");
t1.start();
t2.start();
t3.start();
}
}
3. 线程同步
在 Worker 类的 run 方法中,我们使用 while 循环来等待 currentWorker 的值与当前线程的 ID 相等。这意味着当前线程是应该执行任务的线程。
当 currentWorker 的值与当前线程的 ID 相等时,线程将执行任务,并打印出一条消息。然后,它将 currentWorker 的值增加 1,并调用 notifyAll 方法唤醒其他等待的线程。
这样,线程将按照顺序执行,每个线程都会等待前一个线程完成任务后再开始执行。
总结
通过使用 notify 方法,我们可以实现多个线程之间的同步,并按照一定的顺序执行任务。在实际应用中,可以根据具体需求调整线程同步的方式,以达到最佳效果。
