我有一个任务问题。也就是说,我们必须编写一个类,从 Threads 中调用它。其中一种方法是:
public static synchronized void waitForResults() {
}
所以主线程调用这个方法,然后主线程触发另一个线程,新的工作要做。我如何告诉主线程他在睡觉,而工作线程工作?
我有一个任务问题。也就是说,我们必须编写一个类,从 Threads 中调用它。其中一种方法是:
public static synchronized void waitForResults() {
}
所以主线程调用这个方法,然后主线程触发另一个线程,新的工作要做。我如何告诉主线程他在睡觉,而工作线程工作?
使用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();
因此,而不是synchronized
块waits
,notifies
你可以:
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();
}