【问题标题】:Write a static synchronized method (wait for a result from thread)编写一个静态同步方法(等待线程的结果)
【发布时间】:2013-06-12 11:46:38
【问题描述】:

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

public static synchronized void waitForResults() {

}

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

【问题讨论】:

  • Master-Thread triggers an other Thread 这是否意味着另一个线程在waitForResults 内启动?

标签: java multithreading static deadlock synchronized


【解决方案1】:

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

例如,如果您的主线程调用另一个线程将更改result 变量的值。然后,您可以在resultwait,直到它被其他线程获得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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2016-11-13
    • 2014-03-09
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多