java 中线程等待与通知的实现

前言:

关于等待/通知,要记住的关键点是:

必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。

wait()、notify()、notifyAll()都是Object的实例方法。与每个对象具有锁一样,每个对象可以有一个线程列表,他们等待来自该信号(通知)。线程通过执行对象上的wait()方法获得这个等待列表。从那时候起,它不再执行任何其他指令,直到调用对象的notify()方法为止。如果多个线程在同一个对象上等待,则将只选择一个线程(不保证以何种顺序)继续执行。如果没有线程等待,则不采取任何特殊操作。

示例代码:

package threadwait;

public class ThreadA extends Thread{

public int num = 0;

public void run(){

synchronized (this){//在此类对象上实现同步,this指代当前对象

for(int i = 0 ; i < 3 ; ++i)

this.num+=i;

notifyAll();//通知所有在这个对象上等待的线程开始执行,在这里就是通知TestNotify主线程开始执行

}

}

public int getNum(){

return this.num;

}

}

package threadwait;

public class TestNotify{

public static void main(String args[]){

ThreadA threada = new ThreadA();

threada.start();//threada线程有执行的资格,但是还没有开始执行

synchronized(threada){

try{

threada.wait();//主线程等待threada线程执行结束才开始执行

//而且只有获得了当前threada对象的锁之后才能执行wait,就是说在同步域内才可以执行wait,执行wait后放弃对象锁

}catch(InterruptedException e){

e.printStackTrace();

}

}

System.out.println(threada.getNum());

}

}

同步可以是在class级别上的,synchronized(A.class),也可以是在对象级别上的synchronized(this),可以是静态同步方法,static synchronized ,静态同步方法是在class级别上的,非静态同步方法是在类对象级别上的,一个类对象只有一个锁,只有获得了该锁才可以对他执行wait操作,后释放掉该锁。

更进一步的实例代码如下:

package threadwait;

public class ThreadA extends Thread{

public int num = 0;

public void run(){

synchronized (this){//在此类对象上实现同步,this指代当前对象

for(int i = 0 ; i < 3 ; ++i)

this.num+=i;

try{

Thread.sleep(500);//如果ThreadB的三个示例线程在还没有进入等待状态之前就受到了notifyall的信号

//那将会发生严重后果,因为调用notifyall的线程只可以调用一次notifyall,那造成等待的线程将永远等待下去

//所以在此处让它睡一小会,让其他线程有时间进入等待状态。

//不然会收到

}catch(InterruptedException e){

e.printStackTrace();

}

notifyAll();//通知所有在这个对象上等待的线程开始执行,在这里就是通知TestNotify主线程开始执行

}

// notifyAll();

}

public int getNum(){

return this.num;

}

}

package threadwait;

public class ThreadB extends Thread{

private ThreadA threada;

public ThreadB(ThreadA ta){

this.threada = ta;

}

public void run(){

System.out.println(Thread.currentThread().getName()+" is waitting.");

synchronized(threada){

try{

threada.wait();

}catch(InterruptedException e){

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+" "+this.threada.getNum());

}

}

}

package threadwait;

public class TestNotify{

public static void main(String args[]){

ThreadA threada = new ThreadA();

new ThreadB(threada).start();

new ThreadB(threada).start();

new ThreadB(threada).start();

threada.start();

}

}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java线程等待_java 中线程等待与通知的实现相关推荐

  1. java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

    我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...

  2. java sleep唤醒_Java中的等待唤醒机制—至少50%的工程师还没掌握!

    Java中的等待唤醒机制-至少50%的工程师还没掌握! 发布时间:2019-12-14 01:53, 浏览次数:222 , 标签: Java 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新 ...

  3. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  4. java for(o t :object) 获取顺序号_java中线程的生命周期

    线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发. java中Thread的状态 java中Thread有6种状态,分别是: NEW – 新创 ...

  5. java什么时候需要同步_JAVA中线程在什么时候需要同步和互斥

    JAVA中线程在什么时候需要同步和互斥 关注:265  答案:6  mip版 解决时间 2021-01-27 08:10 提问者时光易老 2021-01-27 03:32 JAVA中线程在什么时候需要 ...

  6. java 获取线程某个_Java中如何唤醒“指定的“某个线程

    熟悉线程操作的小朋友应该知道,Java中线程的挂起和唤醒一般用synchronized + wait + notify完成. 比如: synchronized(o) { o.wait(); //wai ...

  7. java中线程总结_java中多线程学习笔记总结

    线程的简单学习笔记: 1.进程与线程的概念 进程:从用户角度看进程是应用程序的一个执行过程. 从操作系统核心角度看进程代表的是操作系统分配的内存和CPU时间片等资源的基本单位,是为正在运行的程序提供的 ...

  8. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  9. java判断线程结束_java中如何判断一个线程是否结束

    我们可以通过调用thread.Join()方法,把要判断的线程加入到当前线程中,这样可以将两个交替执行的线程合并为顺序执行的线程.如果顺利执行,则说明该线程未结束. (视频教程推荐:java视频) 比 ...

最新文章

  1. R回归模型glm与lm的区别
  2. .NET Compact Framework下SQL CE的使用
  3. 算法设计与分析 2 二维递推间接递推递归分析
  4. Xamarin图表开发基础教程(6)OxyPlot框架
  5. java清空redis缓存数据库_java相关:Spring Cache手动清理Redis缓存
  6. 南邮微型计算机实验,南邮 微机原理 微型计算机与接口技术 微机原理实验.doc...
  7. IE7.0默认主页修改
  8. Lost Array(CF-1043B)
  9. 传统企业如何选择优质的微信解决方案提供商
  10. EGS5在linux系统下安装过程
  11. webpack手动构建vue和vue-cli构建使用 px2rem-loader ,全局自动转换px单位,让自适应来的更简单点!...
  12. dm连接mysql_DM数据库JDBC连接
  13. lomboz eclipse怎么连接oracle10,lomboz eclipse 3.3的安装和连接oracle 11g(图解详细教程)...
  14. 网络工程属于计算机还是通信,通信工程属于计算机大类吗 哪个大类
  15. 教你用微信带称呼群发祝福
  16. 3-33在图 3-31中,以太网交换机有6个接口,分别接到5台主机和一个路由器。在下面表中的“动作”一栏中,表示先后发送了4个帧。假定在开始时,以太网交换 机的交换表是空的。试把该表中其他的栏目都填写
  17. Types of light 光照类型 光照系列4
  18. 中国的数字化转型 China’s digital transformation
  19. 标准输出缓存在多进程代码中引起的一个问题
  20. OpenWrt 4G网卡拨号配置

热门文章

  1. Java 并发编程之 FutureTask
  2. github 部署mysql_GitHub - luckman666/deploy_mysql_cluster: 一键部署mysql集群
  3. Java 算法 约数个数
  4. 天津农学院计算机考研专业,2021年天津农学院计算机与信息工程学院考研专业目录_研究生考试范围 - 学途吧...
  5. java中字符 的含义 有什么作用_Java中字符串常见题之String相关讲解
  6. 解决java连接mysql警告:Establishing SSL connection without server‘s identity verification is not recommend.
  7. scrapy使用(无头)浏览器爬取动态网页
  8. oracle9i的erp数据库无法正常关闭的解决方法。
  9. SQL注入之Mysql报错注入
  10. 大端字节序小端字节序(网络字节序主机字节序)