java多线程之wait和notify
多线程中的通信是非常重要的概念,线程直接实现通信就可以并发完成很多复杂工作。
java在Object类中就设计了wait()和notify()两个方法,以解决这个问题。
1.释义:
wait()方法将当前线程暂停,置于“预执行队列”中,而notify()则用于通知一个在wait等待中的线程,可以继续执行了
2.wait()和notify()的使用条件:
wait()和notify()必须置于同步方法和同步代码块中使用,即在调用前,线程必须获得该对象的对象级别锁。否则会抛出异常
3.线程执行到wait()时,直接释放锁,处于等待状态;
public class WaitService {
public void testMethod(Object lock) {
try {
synchronized (lock) {
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class WaitThread1 extends Thread {
private Object lock;
public WaitThread1(Object lock) {
this.lock = lock;
}
@Override
public void run() {
WaitService service = new WaitService();
service.testMethod(lock);
}
}
public class WaitThread2 extends Thread {
private Object lock;
public WaitThread2(Object lock) {
this.lock = lock;
}
@Override
public void run() {
WaitService service = new WaitService();
service.testMethod(lock);
}
}
public class WaitTest {
public static void main(String[] args) {
Object lock=new Object();
WaitThread1 t1=new WaitThread1(lock);
WaitThread2 t2 = new WaitThread2(lock);
t1.start();
t2.start();
}
}
执行结果:
wait begin
wait begin
4.线程执行notify时,当前线程并不马上释放锁,wait状态的线程也不会马上获得锁,要执行notify方法的程序执行完,退出syncronized代码块后,才释放锁。
public class NotifyService {
public void testMethod(Object lock){
try {
synchronized (lock){
System.out.println("wait begin");
lock.wait();
System.out.println("wait end");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void notifyMethod(Object lock){
try {
synchronized (lock) {
System.out.println("begin nofity ");
Thread.sleep(1000);
lock.notify();
System.out.println("end nofity ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class NotifyThreadA extends Thread{
private Object lock;
public NotifyThreadA(Object lock) {
this.lock = lock;
}
@Override
public void run() {
NotifyService service=new NotifyService();
service.testMethod(lock);
}
}
public class NotifyThreadB extends Thread {
private Object lock;
public NotifyThreadB(Object lock) {
this.lock = lock;
}
@Override
public void run() {
NotifyService service=new NotifyService();
service.notifyMethod(lock);
}
}
public class NotifyTest {
public static void main(String[] args) {
Object lock=new Object();
NotifyThreadA a = new NotifyThreadA(lock);
a.start();
NotifyThreadB b = new NotifyThreadB(lock);
b.start();
}
}
输出:
wait begin
begin nofity
end nofity
wait end
java多线程之wait和notify的更多相关文章
- java多线程之wait和notify协作,生产者和消费者
这篇直接贴代码了 package cn.javaBase.study_thread1; class Source { public static int num = 0; //假设这是馒头的数量 } ...
- Java多线程之Wait()和Notify()
1.Wait()和Notify.NotifyAll都是Object的方法 2.多线程的协作是通过控制同一个对象的Wait()和Notify()完成 3.当调用Wait()方法时,当前线程进入阻塞状态, ...
- Java多线程之wait、notify/notifyAll 详解,用wait 和notifyAll 以及synchronized实现阻塞队列,多线程拓展之ReentrantLock与Condition
前言:这几天看了很多关于多线程的知识,分享一波.(但是目前接触的项目还未用到过,最多用过线程池,想看线程池 请看我之前的博客) 关于基本的理论等 参考如下: https://www.cnblogs.c ...
- java 多线程之synchronized wait/notify解决买票问题
一.Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的st ...
- 1.Java多线程之wait和notify
1.首先我们来从概念上理解一下这两个方法: (1)obj.wait(),当obj对象调用wait方法时,这个方法会让当前执行了这条语句的线程处于等待状态(或者说阻塞状态),并释放调用wait方法的对象 ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- JAVA多线程之volatile 与 synchronized 的比较
一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...
- java多线程之yield,join,wait,sleep的区别
Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...
- Java多线程之ConcurrentSkipListMap深入分析(转)
Java多线程之ConcurrentSkipListMap深入分析 一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下, ...
随机推荐
- vmware tools 的安装(Read-only file system 的解决)
安装 vmware tools 之后,才能将 vmware 创建的虚拟机以全屏的形式显示. 下载:在 vmware 软件的菜单栏点击[虚拟机],在[虚拟机]的主菜单中选择[安装 VMware Tool ...
- .NET CORE的TagHelper智能提示
VisualStudio2017下ASP.NET CORE的TagHelper智能提示不能使用的解决办法 之前在VS2017RC中就发现该问题,安装了依赖,但是前段一直点不出来asp-for,后来 ...
- Java SE学问Random
这篇文章是在网络上的文章内容摘要学习以及自己的小练习,感谢您的无私分享. 昨天在项目中想使用几个随机数.结果使用Random时竟然出现随机数同样的情况.忍不住查了些资料. 现将代码总结例如以下: pa ...
- Android官方教程翻译(1)——创建第一个Android应用
转载请注明出处:http://blog.csdn.net/dawanganban/article/details/9822431 Building Your First App GETSTARTED ...
- DB 查询分析器 轻松创建DB2定义他们自己的函数
DB 查询分析器 方便地创建DB2自己定义函数 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 ...
- java静态方法Static
静态方法 是 与类 而 不是与对象 相关联的.
- 彩色图像--色彩空间 RGB系列
学习DIP第62天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://gi ...
- #747 –在WPF程序的触摸操作中使用惯性移动 (Implementing Inertia during Touch Manipulation)
原文:#747 –在WPF程序的触摸操作中使用惯性移动 (Implementing Inertia during Touch Manipulation) 原文地址:https://wpf.2000th ...
- 用callgraph生成的函数调用关系图
Wu Zhangjin 创作于 2015/04/05 评论打赏 By Falcon of TinyLab.org 2015/04/03 1 故事缘由 源码分析是程序员离不开的话题.无论是研究开源项目, ...
- Spring MVC 专题
Spring静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取.在Springboot中默认的静态资源路径有:classpath:/META-INF/resources/,c ...