public class TestWait{

private List list = new ArrayList();

public TestWait(){

}

public synchronized Object get(){

System.out.println(Thread.currentThread()+"进入了...");

while(list.isEmpty()){

System.out.println(Thread.currentThread()+"在等待.....");

try{

//list为空,线程挂起,并释放出对象锁,从而让下一个线程进入该安全方法 wait();

}catch(Exception

e){

e.printStackTrace();

};

}

Object o = list.get(0);

list.remove(0);

return o;

}

public synchronized void put(){

System.out.println(Thread.currentThread()+"在加了一个值...");

list.add("nnn");

System.out.println("唤醒线程..");

//将wait的线程唤醒

notifyAll(); }

public static void

main(String[] args){

try{

TestWait tw =

new TestWait();

new

ThreadA(tw).start();

new

ThreadB(tw).start();

new

ThreadA(tw).start();

new

ThreadB(tw).start();

}catch(Exception e){

e.printStackTrace();

};

}

}

class ThreadA extends Thread{

TestWait tw = null;

public ThreadA(TestWait tw){

this.tw = tw;

}

public void run(){

for(int i=0;i<10;i++){

try{

System.out.println(Thread.currentThread()+"取到了值:"+tw.get());

sleep(100);

tw.put();

}catch(Exception

e){

e.printStackTrace();

}

}

}

}

class ThreadB extends Thread{

TestWait tw = null;

public ThreadB(TestWait tw){

this.tw = tw;

}

public void run(){

for(int i=0;i<10;i++){

try{

sleep(100);

}catch(Exception

e){

e.printStackTrace();

}

tw.put();

}

}

}

####测试内容如下

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]在等待.....

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]在等待.....

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-0,5,main]在等待.....

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-1,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-2,5,main]进入了...

Thread[Thread-2,5,main]取到了值:nnn

Thread[Thread-3,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]进入了...

Thread[Thread-0,5,main]取到了值:nnn

Thread[Thread-2,5,main]在加了一个值...

唤醒线程..

Thread[Thread-0,5,main]在加了一个值...

唤醒线程..

######jdk1.5以后的版本

ReentrantLock也能得到以上结果,如下

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.locks.*;

public class TestWaitjdk15{

private List list = new ArrayList();

//锁

private ReentrantLock lock = new

ReentrantLock();

//条件 相当于之前的 wait 与 notify;

Condition con =

lock.newCondition();

public TestWaitjdk15(){

}

public Object get(){

lock.lock();

try{

System.out.println(Thread.currentThread()+"进入了...");

while(list.isEmpty()){

System.out.println(Thread.currentThread()+"在等待.....");

try{

//list为空,线程挂起,并释放出对象锁,从而让下一个线程进入该安全方法 con.await();

}catch(Exception

e){

e.printStackTrace();

};

}

Object o = list.get(0);

list.remove(0);

return o;

}finally{

lock.unlock();

}

}

public void put(){

lock.lock();

try{

System.out.println(Thread.currentThread()+"在加了一个值...");

list.add("nnn");

System.out.println("唤醒线程..");

//将wait的线程唤醒

con.signalAll();

}finally{

lock.unlock();

}

}

public static void main(String[] args){

try{

TestWaitjdk15

tw = new TestWaitjdk15();

new

ThreadC(tw).start();

new

ThreadD(tw).start();

new

ThreadC(tw).start();

new

ThreadD(tw).start();

}catch(Exception e){

e.printStackTrace();

};

}

}

class ThreadC extends Thread{

TestWaitjdk15 tw = null;

public ThreadC(TestWaitjdk15 tw){

this.tw = tw;

}

public void run(){

for(int i=0;i<10;i++){

try{

System.out.println(Thread.currentThread()+"取到了值:"+tw.get());

sleep(100);

tw.put();

}catch(Exception

e){

e.printStackTrace();

}

}

}

}

class ThreadD extends Thread{

TestWaitjdk15 tw = null;

public ThreadD(TestWaitjdk15 tw){

this.tw = tw;

}

public void run(){

for(int i=0;i<10;i++){

try{

sleep(100);

}catch(Exception

e){

e.printStackTrace();

}

tw.put();

}

}

}

java+synchro_synchrozied,wait()与notify()的理解相关推荐

  1. Java的wait()、notify()学习三部曲之一:JVM源码分析

    原文链接:https://blog.csdn.net/boling_cavalry/article/details/77793224 综述 Java的wait().notify()学习三部曲由三篇文章 ...

  2. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  3. 阿里JAVA开发手册零度的思考理解(二)

    转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...

  4. java static关键字_好程序员Java教程分享static关键字的理解

    好程序员Java教程分享static关键字的理解,static关键字含义可以理解为静态的. 1. 当其修饰属性时,该属性为整个类公有,所有的对象操作的都是同一个静态属性.所以调用时应该使用类名去调用, ...

  5. Java受查异常和运行时异常的理解

    Java受查异常和运行时异常的理解 概念与理解 怎么处理 概念与理解 Java提供三种可抛出结构(throwable):受查异常(checked exception),运行时异常(runtime ex ...

  6. wait和notify的理解与使用

    1.对于wait()和notify()的理解 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify()  Wakes up a s ...

  7. Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构

    Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...

  8. Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...

      Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...

  9. Java 面向对象:super关键字的理解

    Java 面向对象:super关键字的理解 一.Super关键字: 1. super调用父类的构造方法,必须在构造方法的第一个 2. super只能出现在子类的方法或构造方法中! 3. super和t ...

最新文章

  1. ExtendHelper
  2. Spring Boot - 自动装配中的不可忽视的@Import
  3. mysql函数包含的意思_MYSQL函数
  4. Python中NotImplementedError的使用方法(抽象类集成子类实现)
  5. android 应用区高度,Android创建显示区高度可以调整的ScrollView
  6. java me手机版,一个经典的 JAVA ME 手机程序入门级源码
  7. DbEntry.Net---又一个国产开源ORM数据访问及 WEB 框架
  8. PostgreSQL Excel包含中文字符的数据导入方法
  9. 如何连接一个Linux服务器
  10. WPS简历模板的图标怎么修改_官方发福利一起来薅羊毛啦!教你免费领WPS会员
  11. 利用SAP Leonardo做图片近似查找 ——Python实现
  12. 容量治理-扩容、限流和降级
  13. web前端网页制作课作业:使用HTML+CSS技术制作中华传统文化网站【文房四宝】学生网页设计作品 简单静态HTML网页作品
  14. 如何避免“被贷款”影响个人信用记录?
  15. Dynamic GCN:Dynamic GCN: Context-enriched Topology Learning for Skeleton-based Action Recognition
  16. 词嵌入、句向量等方法汇总
  17. Windows 纤程/协程
  18. DM8数据库备份与恢复 DMRMAN
  19. CSS/HTML简单静态页面
  20. CSRF漏洞检测与发现

热门文章

  1. linux cpu 实际进程,linux – 找出高CPU占用率的apache进程实际上在做什么?
  2. 汇编原理实验 --类型统计(字母,数字,其他字符的个数)
  3. CAN总线的初步认识
  4. matlab hsv提取s_Matlab进阶教程 | 基于不规则已知点插值
  5. mysql分库负载均衡_订单模块以及负载均衡和分库分表
  6. HTML5移动端拖动惯性
  7. D - Connect the Cities (HDU - 3371)
  8. PHPStorm IDE 快捷键
  9. NOI模拟题4 Problem C: 填格子(board)
  10. BZOJ 1968 [Ahoi2005]COMMON 约数研究