文档章节

Java多线程中关于notify和wait

hopana
 hopana
发布于 2015/05/04 16:38
字数 290
阅读 15
收藏 0

程序功能:4个线程,2个线程对某个数值进行加1;2个线程进行减1,要求该数在0和1之间切换。程序如下,大家看看问题出在哪里:

 

DecThread类,对sample的i进行减1的线程:

public class DecThread extends Thread{
 private Sample sample;
 
 public DecThread(Sample sample, String name){
  super(name);
  this.sample = sample;
 }
 @Override
 public void run() {
  for(int i=0; i<20; i++){
   sample.dec();
  }
 }
 
}

IncThread 类,对sample的i进行加1的线程:

 public class IncThread extends Thread{
 private Sample sample;
 public IncThread(Sample sample, String name){
  super(name);
  this.sample = sample;
 }
 @Override
 public void run() {
  for(int i=0; i<20; i++){
   sample.inc();
  }
 }
 
}

Sample类:

 public class Sample {
 int i = 0;
 public synchronized void inc() {
  try {
   while (i == 1) {
    wait();
   }
   i++;
   System.out.println(Thread.currentThread().getName() + "-" + i);
   notify();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
 public synchronized void dec() {
  try {
   while (i == 0) {
    wait();
   }
   i--;
   System.out.println(Thread.currentThread().getName() + "-" + i);
   notify();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
 }
}

测试类TestIncDec :

 public class TestIncDec {
 public static void main(String[] args) {
  Sample sample = new Sample();
  
  IncThread inc1 = new IncThread(sample,"inc1");
  IncThread inc2 = new IncThread(sample,"inc2");
  
  DecThread dec1 = new DecThread(sample,"dec1");
  DecThread dec2 = new DecThread(sample,"dec2");
  
  inc1.start();
  inc2.start();
  dec1.start();
  dec2.start();
 }
}

 

© 著作权归作者所有

hopana
粉丝 1
博文 1
码字总数 290
作品 0
黄冈
私信 提问
加载中

评论(1)

hopana
hopana 博主
看起来没有问题,但是会造成所有的线程都变成wait状态,都进入等待池........怎么解释,怎么解决?
多线程通信的三大法器,你真的会用吗?

wait, notify, notifyAll 是多线程之间通信最重要的 3 个方法,今天,栈长给大家普及一下它们的知识要点及应用实战。 定义 wait:让持有该对象锁的线程等待; notify: 唤醒任何一个持有该对象...

Java技术栈
2018/11/27
35
0
Java多线程学习(四)等待/通知(wait/notify)机制

系列文章传送门: Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1) java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Ja...

一只蜗牛呀
2018/04/16
0
0
白话JAVA线程的synchronized、wait、notify、notifyall如何配合工作

JAVA线程的synchronized、wait、notify、notifyall如何配合工作 概念:锁池、等待池、同步、资源锁、等待、唤醒 流程描述: 1.资源锁:多线程场景下的公共资源,资源锁对象有锁池和等待池两个...

飓风2000
03/21
28
0
wait、notify、notifyAll

wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。 这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 如果对象调用...

milne
2015/08/18
48
0
Java并发编程之线程安全、线程通信

Java多线程开发中最重要的一点就是线程安全的实现了。所谓Java线程安全,可以简单理解为当多个线程访问同一个共享资源时产生的数据不一致问题。为此,Java提供了一系列方法来解决线程安全问题...

leoliu168
2018/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部