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