使用wait() 和notify() 机制。每个 java 对象都拥有这些方法。一种机制会阻塞线程,直到满足某些条件。
例如,如果您的主线程调用另一个线程将更改result 变量的值。然后,您可以在result 上wait,直到它被其他线程获得notified:
private static StringBuilder result= new StringBuilder();
public static void mainThreadWork() {
new WorkerThread().start();
synchronized (result) {
System.out.println(result.toString()); //prints ""
result.wait();
System.out.println(result.toString()); //prints "modified"
}
}
private static class WorkerThread extends Thread {
@Override
public void run() {
synchronized(result) {
result.append("modified");
result.notify();
}
}
}
会发生什么:当一个线程在某个对象上调用 wait 时,它会为其他线程产生一个 CPU,并且(如方法名称所述)等待另一个线程在该线程上发送 notify 信号。 notify 为等待该对象的线程产生一个 CPU。
必须遵守一些规则,例如,wait() 和 notify() 必须在 synchronized 块内调用。
从 Java 1.5 开始,有更多抽象级别的同步和等待通知机制,因此您可以查看 java 的 concurrent library。它使您可以在更抽象的对象级别上锁定和等待对象:
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
因此,您可以:
public static void mainThreadWork() {
lock.lock();
new WorkerThread().start();
System.out.println(result.toString()); //prints ""
condition.await();
System.out.println(result.toString()); //prints "modified"
lock.unlock();
}
而在WorkerThread:
@Override
public void run() {
lock.lock();
result.append("modified");
condition.singal();
lock.unlock();
}