首页 / 软件开发 / JAVA / Java:其他线程AIP详细信息
Java:其他线程AIP详细信息2011-06-11wait()、notify() 和 notifyAll() 方法除了使用轮询(它可能消耗大量 CPU 资源,而且具有计时不精确的特征),Object 类还包括一些方法,可以让线程相互通知事件的发生。Object 类定义了 wait()、notify() 和 notifyAll() 方法。要执行这些方法,必须拥有相关对象的锁。Wait() 会让调用线程休眠,直到用 Thread.interrupt() 中断它、过了指定的时间、或者另一个线程用 notify() 或 notifyAll() 唤醒它。当对某个对象调用 notify() 时,如果有任何线程正在通过 wait() 等待该对象,那么就会唤醒其中一个线程。当对某个对象调用 notifyAll() 时,会唤醒所有正在等待该对象的线程。这些方法是更复杂的锁定、排队和并发性代码的构件。但是,notify() 和 notifyAll() 的使用很复杂。尤其是,使用 notify() 来代替 notifyAll() 是有风险的。除非您确实知道正在做什么,否则就使用 notifyAll()。与其使用 wait() 和 notify() 来编写您自己的调度程序、线程池、队列和锁,倒不如使用 util.concurrent 包(请参阅参考资料),这是一个被广泛使用的开放源码工具箱,里面都是有用的并发性实用程序。JDK 1.5 将包括 java.util.concurrent 包;它的许多类都派生自 util.concurrent。线程优先级Thread API 让您可以将执行优先级与每个线程关联起来。但是,这些优先级如何映射到底层操作系统调度程序取决于实现。在某些实现中,多个 ― 甚至全部 ― 优先级可能被映射成相同的底层操作系统优先级。在遇到诸如死锁、资源匮乏或其它意外的调度特征问题时,许多人都想要调整线程优先级。但是,通常这样只会把问题移到别的地方。大多数程序应该完全避免更改线程优先级。线程组ThreadGroup 类原本旨在用于把线程集合构造成组。但是,结果证明 ThreadGroup 并没有那样有用。您最好只使用 Thread 中的等价方法。ThreadGroup 确实提供了一个有用的功能部件(Thread 中目前还没有):uncaughtException() 方法。线程组中的某个线程由于抛出了未捕获的异常而退出时,会调用 ThreadGroup.uncaughtException() 方法。这就让您有机会关闭系统、将一条消息写到日志文件或者重新启动失败的服务。SwingUtilities虽然 SwingUtilities 类不是 Thread API 的一部分,但还是值得简单提一下。正如前面提到的,Swing 应用程序有一个 UI 线程(有时叫称为事件线程),所有 UI 活动都必须在这个线程中发生。有时,另一个线程也许想要更新屏幕上某样东西的外观,或者触发 Swing 对象上的一个事件。SwingUtilities.invokeLater() 方法可以让您将 Runnable 对象传送给它,并且在事件线程中执行指定的 Runnable。它的同类 invokeAndWait() 会在事件线程中调用 Runnable,但 invokeAndWait() 会阻塞,直到 Runnable 完成执行之后。void showHelloThereDialog() throws Exception {
Runnable showModalDialog = new Runnable() {
public void run() {
JOptionPane.showMessageDialog(myMainFrame, "Hello There");
}
};
SwingUtilities.invokeLater(showModalDialog);
}对于 AWT 应用程序,java.awt.EventQueue 还提供了 invokeLater() 和 invokeAndWait()。