3. 等待和通知
通过前两个例子的实践,我们知道无论sleep()还是suspend()都不会在自己被调用的时候解除锁定。需要用到对象锁时,请务必注意这个问题。在另一方面,wait()方法在被调用时却会解除锁定,这意味着可在执行wait()期间调用线程对象中的其他同步方法。但在接着的两个类中,我们看到run()方法都是“同步”的。在wait()期间,Peeker仍然拥有对同步方法的完全访问权限。这是由于wait()在挂起内部调用的方法时,会解除对象的锁定。
我们也可以看到wait()的两种形式。第一种形式采用一个以毫秒为单位的参数,它具有与sleep()中相同的含义:暂停这一段规定时间。区别在于在wait()中,对象锁已被解除,而且能够自由地退出wait(),因为一个notify()可强行使时间流逝。
第二种形式不采用任何参数,这意味着wait()会持续执行,直到notify()介入为止。而且在一段时间以后,不会自行中止。
wait()和notify()比较特别的一个地方是这两个方法都属于基础类Object的一部分,不象sleep(),suspend()以及resume()那样属于Thread的一部分。尽管这表面看有点儿奇怪——居然让专门进行线程处理的东西成为通用基础类的一部分——但仔细想想又会释然,因为它们操纵的对象锁也属于每个对象的一部分。因此,我们可将一个wait()置入任何同步方法内部,无论在那个类里是否准备进行涉及线程的处理。事实上,我们能调用wait()的唯一地方是在一个同步的方法或代码块内部。若在一个不同步的方法内调用wait()或者notify(),尽管程序仍然会编译,但在运行它的时候,就会得到一个IllegalMonitorStateException(非法监视器状态违例),而且会出现多少有点莫名其妙的一条消息:“current thread not owner”(当前线程不是所有人”。注意sleep(),suspend()以及resume()都能在不同步的方法内调用,因为它们不需要对锁定进行操作。
只能为自己的锁定调用wait()和notify()。同样地,仍然可以编译那些试图使用错误锁定的代码,但和往常一样会产生同样的IllegalMonitorStateException违例。我们没办法用其他人的对象锁来愚弄系统,但可要求另一个对象执行相应的操作,对它自己的锁进行操作。所以一种做法是创建一个同步方法,令其为自己的对象调用notify()。但在Notifier中,我们会看到一个同步方法内部的notify():
synchronized(wn2) {
wn2.notify();
}
其中,wn2是类型为WaitNotify2的对象。尽管并不属于WaitNotify2的一部分,这个方法仍然获得了wn2对象的锁定。在这个时候,它为wn2调用notify()是合法的,不会得到IllegalMonitorStateException违例。
分享到:
相关推荐
总结来说,C#的多线程和等待窗体技术是构建高效、用户友好应用的关键部分。通过合理利用`Thread`、`Task`以及异步编程,我们可以创建出即使在执行耗时操作时也能保持响应性的应用程序。等待窗体是这种体验的重要组成...
notify()方法的作用是通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈wait状态的线程,对其发出通知notify,并使它等待获取该对象的对象锁。需要说明的是,在...
总之,线程异步工作和线程间的异步通知是多线程编程中的重要概念,通过合理使用C++11及更高版本提供的并发工具,可以构建高效且响应迅速的多线程应用程序。正确理解和运用这些工具,能够帮助开发者优化系统性能,...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
- `AutoResetEvent` 和 `ManualResetEvent`:事件信号,用于线程间的等待和通知。 - `ThreadPool`:线程池,预创建一组线程,用于执行短期任务,提高效率。 - `Join`:等待线程完成。 - `WaitHandle`:等待多个...
在多线程环境下,线程等待和通报是控制线程间协作的重要手段。Java的`java.util.concurrent.locks.Condition`接口提供了这一功能。线程可以通过`await()`方法进入等待状态,直到收到`signal()`或`signalAll()`通知后...
在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。Delphi,作为一个流行的Object Pascal开发环境,提供了丰富的工具和库来支持多线程编程。本篇文章将深入...
本文将深入探讨如何利用QT库,特别是QT5.11.1版本,来构建多线程的TCP服务器和客户端,以及QThread在其中的作用。 首先,让我们了解TCP(传输控制协议)。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议...
在计算机编程中,多线程是一种并发执行任务的技术,它允许多个子任务在同一时间运行,从而提高了程序的效率和响应性。这个“多线程例子”演示了如何在C++环境中实现多线程功能。下面我们将深入探讨多线程的基本概念...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...
在C#编程中,多线程是一种允许程序同时执行多个任务的技术,它极大地提高了应用程序的性能和响应速度。本文将深入探讨C#中的多线程概念、线程池的使用以及如何通过实例理解其工作原理。 首先,多线程在C#中是通过`...
本文将深入探讨Linux环境中的多线程概念、创建与管理线程的方法、线程同步与通信机制,以及多线程编程中可能遇到的问题和解决策略。 一、多线程概念 多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码...
5. Java多线程学习(四)等待/通知(wait/notify)机制 6. Java多线程学习(五)线程间通信知识点补充 7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八...
多线程是现代程序设计中一个关键的概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在易语言中,使用大漠插件实现多线程可以更好地处理并发操作,例如批量下载、数据处理、网络爬虫等场景。 首先,...
**CC++多线程编程**是现代软件开发中的重要组成部分,尤其在高性能计算、服务器端应用和实时系统中,多线程技术能充分利用多核处理器的资源,提高程序的执行效率。以下是一些关于CC++多线程编程的核心知识点: 1. *...
在多线程环境中,有时需要暂停某个线程以等待特定条件满足,或者让其他线程优先执行。 8. **Example_Golbals.au3**: 全局变量在多线程中用于线程间的通信和数据共享。这个例子可能展示了如何安全地使用全局变量,...
在VB6.0中实现多线程是一项挑战,但通过本次实验,我们成功地展示了如何在Visual Basic 6.0环境中创建和管理多线程应用。多线程技术允许一个程序同时执行多个独立的任务,提高了应用程序的响应速度和效率,尤其是在...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,它能够充分利用多核处理器的计算能力,提高程序的响应速度和效率。`WaitForSingleObject`和`WaitForMultipleObjects`是Windows API中...
* 提高应用程序响应:多线程技术可以避免整个系统等待耗时长的操作,从而提高应用程序的响应速度。 * 使多 CPU 系统更加有效:操作系统会保证当线程数不大于 CPU 数目时,不同的线程运行于不同的 CPU 上。 * 改善...
Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...