在多线程编程中,线程间的协作是非常重要的。一个线程可能需要等待另一个线程完成某个任务后才能继续执行,这就需要使用线程间的协作机制。

Java提供了一个wait()方法,可以让一个线程暂时放弃对资源的占用,并进入等待状态,直到其他线程通知它继续执行。下面我们来看一下如何使用wait()方法进行线程间的协作。

首先,我们需要创建一个共享的对象作为线程间进行协作的资源。可以是一个对象、一个集合或者是一个文件等等。下面以一个简单的对象为例:

Text
public class SharedObject {
    private boolean flag = false;
    
    public synchronized void waitMethod() {
        while (!flag) {
            try {
                wait(); // 调用wait()方法,当前线程释放对资源的占用,并进入等待状态
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        
        // 执行需要等待其他线程完成的任务
        System.out.println("waitMethod executed");
    }
    
    public synchronized void notifyMethod() {
        // 执行需要通知其他线程的任务
        
        flag = true;
        notify(); // 调用notify()方法,通知正在等待的线程可以继续执行了
    }
}

在这个例子中,SharedObject类有一个布尔类型的flag变量,初始值为false。waitMethod()方法使用了synchronized关键字进行修饰,表示在执行该方法时获取该对象的锁。如果flag为false,进入while循环,调用wait()方法释放锁,并进入等待状态。在另一个线程中,调用notifyMethod()方法,将flag变量设置为true,并调用notify()方法发送通知,唤醒处于等待状态的线程,让它们继续执行。

下面是一个简单的测试例子:

Text
public class Main {
    public static void main(String[] args) {
        SharedObject sharedObject = new SharedObject();
        
        Thread thread1 = new Thread(() -> {
            sharedObject.waitMethod();
        });
        
        Thread thread2 = new Thread(() -> {
            sharedObject.notifyMethod();
        });
        
        thread1.start();
        thread2.start();
    }
}

在这个例子中,创建了两个线程,一个线程执行waitMethod()方法,另一个线程执行notifyMethod()方法。运行程序后,可以看到在waitMethod()方法中的打印语句被执行了,表示线程间的协作成功。

使用wait()方法进行线程间的协作可以实现线程的同步,确保线程之间按照预期的顺序执行。这在并发编程中是非常有用的。但需要注意的是,在使用wait()方法和notify()方法时需要获取对象的锁,因此需要注意锁的控制,以避免死锁的发生。

参考文献:

[1] Java Concurrency in Practice. Brian Goetz, Timothy Peierls, Joshua Bloch, et al. Addison-Wesley Professional, 2006.