java+synchro_synchrozied,wait()与notify()的理解
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()的理解相关推荐
- Java的wait()、notify()学习三部曲之一:JVM源码分析
原文链接:https://blog.csdn.net/boling_cavalry/article/details/77793224 综述 Java的wait().notify()学习三部曲由三篇文章 ...
- java局部变量全局变量,实例变量的理解
java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- java static关键字_好程序员Java教程分享static关键字的理解
好程序员Java教程分享static关键字的理解,static关键字含义可以理解为静态的. 1. 当其修饰属性时,该属性为整个类公有,所有的对象操作的都是同一个静态属性.所以调用时应该使用类名去调用, ...
- Java受查异常和运行时异常的理解
Java受查异常和运行时异常的理解 概念与理解 怎么处理 概念与理解 Java提供三种可抛出结构(throwable):受查异常(checked exception),运行时异常(runtime ex ...
- wait和notify的理解与使用
1.对于wait()和notify()的理解 对于wait()和notify()的理解,还是要从jdk官方文档中开始,在Object类方法中有: void notify() Wakes up a s ...
- Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构
Java生鲜电商平台-深入理解微服务SpringCloud各个组件的关联与架构 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留 ...
- Java语言程序设计 上机实验2 掌握Java的基本语言成分和流程控制语句。 掌握Java中数组的使用,理解引用数据类型。 掌握String类的使用。...
Java语言程序设计 上机实验2 实验目的: 掌握Java的基本语言成分和流程控制语句. 掌握Java中数组的使用,理解引用数据类型. 掌握String类的使用. 实验内容: 注:标(*)为选做内 ...
- Java 面向对象:super关键字的理解
Java 面向对象:super关键字的理解 一.Super关键字: 1. super调用父类的构造方法,必须在构造方法的第一个 2. super只能出现在子类的方法或构造方法中! 3. super和t ...
最新文章
- ExtendHelper
- Spring Boot - 自动装配中的不可忽视的@Import
- mysql函数包含的意思_MYSQL函数
- Python中NotImplementedError的使用方法(抽象类集成子类实现)
- android 应用区高度,Android创建显示区高度可以调整的ScrollView
- java me手机版,一个经典的 JAVA ME 手机程序入门级源码
- DbEntry.Net---又一个国产开源ORM数据访问及 WEB 框架
- PostgreSQL Excel包含中文字符的数据导入方法
- 如何连接一个Linux服务器
- WPS简历模板的图标怎么修改_官方发福利一起来薅羊毛啦!教你免费领WPS会员
- 利用SAP Leonardo做图片近似查找 ——Python实现
- 容量治理-扩容、限流和降级
- web前端网页制作课作业:使用HTML+CSS技术制作中华传统文化网站【文房四宝】学生网页设计作品 简单静态HTML网页作品
- 如何避免“被贷款”影响个人信用记录?
- Dynamic GCN:Dynamic GCN: Context-enriched Topology Learning for Skeleton-based Action Recognition
- 词嵌入、句向量等方法汇总
- Windows 纤程/协程
- DM8数据库备份与恢复 DMRMAN
- CSS/HTML简单静态页面
- CSRF漏洞检测与发现
热门文章
- linux cpu 实际进程,linux – 找出高CPU占用率的apache进程实际上在做什么?
- 汇编原理实验 --类型统计(字母,数字,其他字符的个数)
- CAN总线的初步认识
- matlab hsv提取s_Matlab进阶教程 | 基于不规则已知点插值
- mysql分库负载均衡_订单模块以及负载均衡和分库分表
- HTML5移动端拖动惯性
- D - Connect the Cities (HDU - 3371)
- PHPStorm IDE 快捷键
- NOI模拟题4 Problem C: 填格子(board)
- BZOJ 1968 [Ahoi2005]COMMON 约数研究