最近在看Java特种兵,看到多线程部分,对wait和notify不是很理解,于是写了代码来帮助理解。特此记录下来,以供回顾。
wait方法通过参数可以指定等待的时长。如果没有指定参数,默认一直等待直到被通知。notify方法是通知某个正在等待这个对象的控制权的线程可以继续运行。
调用wait方法时候,必须加上synchronized同步块,不然会抛出java.lang.IllegalMonitorStateException异常
public class WaitAndNotify { private final static Object object = new Object(); static class ThreadA extends Thread{ public void run(){ //通过object对象进行加锁 synchronized (object) { System.out.println(Thread.currentThread().getName()+":start..."); try { //调用当前对象的wait方法 Thread.currentThread().wait(); } catch (InterruptedException e) { System.out.println("aaaa"); e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":end..."); } } } public static void main(String[] args) throws InterruptedException { ThreadA t1 = new ThreadA(); t1.setName("t1"); t1.start(); Thread.sleep(100); System.out.println(t1.getName()+":"+t1.getState()); } }
这段程序是报异常:
t1:start... Exception in thread "t1" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Unknown Source) at Thread.WaitAndNotify$ThreadA.run(WaitAndNotify.java:15) t1:TERMINATED
原因是:锁对象和调用wait方法的对象不是同一个。wait方法是Object的方法,对象和调用wait方法的对象必须是同一个对象。
以下是修改后的正确代码:
public class WaitAndNotify { private final static Object object = new Object(); static class ThreadA extends Thread{ public void run(){ //通过object对象进行加锁 synchronized (this) { System.out.println(Thread.currentThread().getName()+":start..."); try { //调用当前对象的wait方法 Thread.currentThread().wait(); } catch (InterruptedException e) { System.out.println("aaaa"); e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":end..."); } } } public static void main(String[] args) throws InterruptedException { ThreadA t1 = new ThreadA(); t1.setName("t1"); t1.start(); Thread.sleep(100); System.out.println(t1.getName()+":"+t1.getState()); } }
或者:
public class WaitAndNotify { private final static Object object = new Object(); static class ThreadA extends Thread{ public void run(){ //通过object对象进行加锁 synchronized (object) { System.out.println(Thread.currentThread().getName()+":start..."); try { //调用object对象的wait方法 object.wait(); } catch (InterruptedException e) { System.out.println("aaaa"); e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":end..."); } } } public static void main(String[] args) throws InterruptedException { ThreadA t1 = new ThreadA(); t1.setName("t1"); t1.start(); Thread.sleep(100); System.out.println(t1.getName()+":"+t1.getState()); } }
上面两段代码虽然正确执行了,但是由于线程状态一直是WAITING,会一直等待下去,这个时候,我们使用调用notify方法,让线程继续执行下去
public class WaitAndNotify { private final static Object object = new Object(); static class ThreadA extends Thread{ public void run(){ //通过object对象进行加锁 synchronized (object) { System.out.println(Thread.currentThread().getName()+":start..."); try { //调用object对象的wait方法 object.wait(); } catch (InterruptedException e) { System.out.println("aaaa"); e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":end..."); } } } public static void main(String[] args) throws InterruptedException { ThreadA t1 = new ThreadA(); t1.setName("t1"); t1.start(); Thread.sleep(100); System.out.println(t1.getName()+":"+t1.getState()); //和wait方法一样,需要加锁 synchronized (object) { object.notify(); } } }
相关推荐
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。
java多线程之wait,notify的用法([ 详解+实例 ]).
源码—Java多线程5—死锁和wait notify notifyAll
使用Java多线程的wait和notify方法实现最简单的生产者消费者模式
java多线程下wait和notify的作用
Java多线程的样例代码,工程,内含wait()、notify()和sychronized的使用范例。
主要介绍了java多线程wait,notify,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家一起来学习一下吧
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
主要介绍了Java多线程通讯之wait,notify的区别详解,非常不错,具有一定的参考借鉴借鉴价值,需要的朋友可以参考下
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
绍java多线程之wait(),notify(),notifyAll()
Java多线程同步(wait()notify()notifyAll())[文].pdf
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
java中多线程编程notify、wait的使用
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
5. Java多线程学习(四)等待/通知(wait/notify)机制 6. Java多线程学习(五)线程间通信知识点补充 7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)并发编程中一些问题 9. Java多线程学习(八...
主要介绍了Java多线程通信wait()和notify()代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
本篇文章是对java多线程 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下