1

我有一个任务问题。也就是说,我们必须编写一个类,从 Threads 中调用它。其中一种方法是:

public static synchronized void waitForResults() {

}

所以主线程调用这个方法,然后主线程触发另一个线程,新的工作要做。我如何告诉主线程他在睡觉,而工作线程工作?

4

1 回答 1

3

使用wait()notify()机制。每个 java 对象都拥有这些方法。一种机制会阻塞线程,直到满足某些条件。

例如,如果您的主线程调用另一个将更改变量值的线程result。然后,您可以wait继续使用,result直到它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在某个对象上调用 a 时,它会为其他线程产生一个 CPU,并且(正如方法名称所说)等待另一个线程notify在该线程上发送信号。notify为等待该对象的线程产生一个 CPU。

例如,必须遵守某些规则,wait()并且notify()必须在synchronized块内调用这些规则。


由于 Java 1.5 有更多抽象级别的同步和等待通知机制,因此您可以查看 java 的concurrent library。它使您可以在更抽象的类对象级别上锁定和等待对象:

private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

因此,而不是synchronizedwaitsnotifies你可以:

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();
}
于 2013-06-16T10:23:28.147 回答