public static void main(String[] args) throws Exception {
final Object lock="";
Thread t1=new Thread(){
public void run(){
try {
System.out.println("t1 wait begin");
synchronized (lock) {
lock.wait();
}
System.out.println("t1 wait end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t1.start();
Thread.sleep(5000);
System.out.println("main lock begin");
synchronized (lock) {
lock.notify();
Thread.sleep(10000);
System.out.println("main wait begin ");
lock.wait();
System.out.println("main wait end");
}
System.out.println("main lock end");
t1.join();
System.out.println("process exist");
}
输出:
t1 wait begin
main lock begin
main wait begin
t1 wait end
描述:
线程t1获取lock对象的监视器后,马上调用lock的wait方法,放弃了lock的监视器,
主线程获取lock对象的监视器后,调用lock的notify方法唤醒等待lock的监视器的线程(这里是t1)
之后睡眠10秒,然后调用lock的wait方法放弃lock的监视器。
结论:
1、wait,notify,notifyAll必须在当前线程获得监视器时才能调用,即这些方法必须在同步块中才能调用
2、t1线程,wait方法执行时,t1线程放弃lock对象的监视器,t1线程阻塞,导致同步块代码未执行完。
3、主线程中notify方法执行时,主线程唤醒在等待lock对象监视器的线程(随机的,t1线程只是被标记为可获取监视 器,但实际未获取,详情请看4),另外此方法并不阻塞而是立即返回。
4、主线程notify方法执行后,主线程仍然具有lock对象的监视器,而t1线程仍处于阻塞状态(虽然已经被主线程notify 了), 这点可以看代码,主线程睡眠10秒,而t1线程仍阻塞。只有当主线程调用wait方法,放弃lock的监视器后,
t1线程才真正获得监视器,接着主线程阻塞,而t1线程继续执行同步块中未执行的代码
5、因没有任何线程调用notify方法呼唤主线程了,所以主线程一直阻塞
分享到:
相关推荐
### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...
此外,线程间的通信可以通过wait()、notify()和notifyAll()方法实现,这些方法需要在synchronized上下文中使用。例如,一个线程可能需要等待另一个线程完成某项工作后才能继续,这时就可以使用这些方法进行协调。 ...
下面是一个简单的例子,展示了如何通过 `wait()` 和 `notify()` 控制子线程的执行: ```java public class ThreadControl { private boolean running = false; private Object monitor = new Object(); public ...
5. 分配任务:根据`epoll_wait()`返回的就绪文件描述符,将处理任务放入线程池的任务队列,由空闲线程负责执行。 6. 执行任务:线程从任务队列中取出任务,处理相应的事件,如接收数据、发送数据等。 7. 更新epoll...
此外,还可以使用`CSyncObject`类的`Signal()`和`Wait()`方法来协调线程的执行。 6. **线程安全** 确保代码是线程安全的,意味着在多线程环境下运行不会出现问题。这涉及到避免全局变量的不安全访问,正确地使用...
`pthread_cond_wait()`使线程等待,`pthread_cond_signal()`或`pthread_cond_broadcast()`用来唤醒等待的线程。 - **信号量**:`sem_t`提供了类似互斥锁的功能,但可以控制多个线程的访问数量。 - **读写锁**:`...
标题"多线程经典例子"暗示我们将讨论一些多线程编程中的常见示例。以下是一些经典的应用场景: 1. **下载任务**:当需要从网络下载大文件时,可以创建多个线程分别负责不同部分的下载,这样可以显著加快下载速度。 ...
3. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,但它们必须在`synchronized`代码块中使用,否则会抛出异常。 4. **线程状态**:Java线程有五种状态:新建、可运行、运行、阻塞和...
`Wait()`函数可以使当前线程等待,直到其他线程发出信号,而`Signal()`函数则用来唤醒等待的线程。 **5. 线程生命周期管理** 创建线程后,你需要管理其生命周期。当线程完成任务或不再需要时,应终止它。在PB中,你...
本示例“多线程BUFFER例子”是通过C++实现的,展示了如何在缓冲区(BUFFER)中实现消费者与生产者的并发操作。下面将详细解释这个主题中的关键知识点。 首先,我们要理解什么是生产者-消费者问题。这是一个经典的...
本文将深入探讨“多线程小例子”所涉及的核心概念、原理及其实现方法,以帮助理解其在实际应用中的价值。 首先,我们需要理解什么是线程。线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。...
本主题将深入探讨“线程的例子”,帮助新手入门。 一、线程的概念 线程是进程中的一个执行单元,每个进程至少包含一个线程。线程共享同一进程的内存空间,包括全局变量、静态变量等,但拥有自己的栈空间,用于存储...
if (WaitForSingleObject(g_hMutex, INFINITE) == WAIT_OBJECT_0) { // 持有锁的线程在此执行任务 // ... // 释放互斥锁,允许其他线程获取 ReleaseMutex(g_hMutex); } } int main() { // 创建互斥锁 g_...
在提供的压缩包文件"Moniter.wait例子"中,可能包含了使用`Monitor.wait`和`Monitor.pulse`的实际代码示例,展示了如何在实际应用中协调线程的执行。通过学习和理解这些示例,开发者能够更好地掌握这些同步原语的...
本示例将围绕“关于线程的例子”进行深入探讨,结合Eclipse3.3、MyEclipse6以及jdk1.5的软件环境,我们将学习如何在Java中创建、管理及同步线程。 首先,让我们了解线程的基本概念。线程是进程内的一个执行单元,每...
if(rc==WAIT_TIMEOUT) { //强行退出工作线程 DWORD exitCode; ::GetExitCodeThread(m_hThread, &exitCode;); if ( exitCode==STILL_ACTIVE ) { try { TerminateThread(m_hThread, 0x03); CloseHandle(m_...
4. **线程通信**:PowerBuilder提供了`Send_Event`和`Wait_For_Event`函数,使得线程间能够交换信息和协调工作。 5. **线程控制**:可以通过`Terminate_Thread`函数来终止一个线程,或者使用`Join_Thread`等待线程...
本例展示了Java如何使用synchronized关键字实现线程同步,以及wait()和notify()方法进行线程间的通信。 首先,我们有一个名为`Comsumer`的消费者类,它继承自`Thread`。消费者类中包含一个`Market`对象,表示消费者...