关于wait和notify的问题,帮忙解读一下程序!

问题描述

classshenimplementsRunnable{xunixu;publicshen(xunixu){this.xu=xu;}publicvoidrun(){intx=0;while(true){synchronized(xu){try{if(xu.bfull){xu.wait();}}catch(Exceptionex){}if(x==0){xu.name="lizhao";//try{Thread.sleep(1);}catch(Exceptionex){}xu.sex="man";}else{xu.name="xingyu";xu.sex="male";}xu.bfull=true;xu.notify();}x=(x+1)%2;}}}classxiaoimplementsRunnable{xunixu;publicxiao(xunixu){this.xu=xu;}publicvoidrun(){while(true){synchronized(xu){try{if(!xu.bfull){xu.wait();}}catch(Exceptionex){}System.out.print(xu.name+":");System.out.println(xu.sex);xu.bfull=false;xu.notify();}}}}classxuni{Stringname="no";Stringsex="no";booleanbfull=false;//缓冲区中不为空的标识}classzhu{publicstaticvoidmain(String[]args){xunixu2=newxuni();newThread(newshen(xu2)).start();newThread(newxiao(xu2)).start();}}以上程序的运行顺序是怎么样的?是先运行xiao类中的run方法,还是先运行shen类中的run方法.bfull=false代表缓冲区不为空.如果先运行xiao类中的run方法,就直接进入等待状态了.如果是先运行shen类中的run方法,也是进入等待状态了.我对这个迷糊的不行,谁能给我解读一下:)

解决方案

解决方案二:
楼主我教你怎么贴代码:1、将代码进行良好的格式化,以方便阅读。2、在发帖文本框的上方单击“#”按钮,选择Java3、将代码粘贴到【code=Java】和【/code】之间。发出来的帖子就会是下面的效果:publicclassHello{//程序入口publicstaticvoidmain(String[]args){System.out.println("Hello!");}}

解决方案三:
我也试试publicclassreadPro{publicstaticvoidmain(String[]args)throwsIOException{Propertiespro=newProperties();FileInputStreamfis=newFileInputStream("pro.properties");pro.load(fis);}}

解决方案四:
不是没从给你回答,只要看你的程序太累(命名有问题),自已参考这:要想调用wait()就得先获得对象锁(所以wait()只能在同步语句块里调用),如果一个线程wait()它就会在释放对象锁的同时进入等待池,除非有线程触发notify()才能把它从等待池中释放出来两种情况:运行状态--(synchronized)----->得到对象锁--------(wait())------->等待池---(外部的notify())---->synchronized外等待等待得不到就一直等待(在对象锁池)没notify()就一直在等待池里等着(除非它再次获得对象锁)运行状态--synchronized------->进入对象锁池----得到对象锁--->就绪状态
解决方案五:
classtest1implementsRunnable{intable=0;test3t3;publictest1(test3t3){this.t3=t3;}publicvoidrun(){while(true){if(able==0){t3.set("lizhao","man");able=1;}else{t3.set("xingyu","male");able=0;}}}}classtest2implementsRunnable{test3t3;publictest2(test3t3){this.t3=t3;}publicvoidrun(){while(true){t3.get();}}}classtest3{Stringname="no";Stringsex="no";booleanbfull=false;publicsynchronizedvoidset(Stringname,Stringsex){if(bfull){try{wait();}catch(Exceptionex){}}this.name=name;this.sex=sex;bfull=true;notify();}publicsynchronizedvoidget(){if(!bfull){System.out.println(!bfull);try{wait();}catch(Exceptionex){}}System.out.println(name+":"+sex);bfull=false;notify();}}classtest4{publicstaticvoidmain(String[]args){test3t3=newtest3();newThread(newtest1(t3)).start();newThread(newtest2(t3)).start();}}

我把原来的代码改动了一下,这样看起来清楚点.问题是:在test3类中的set()方法中,if(bfull)这个括号中的bfull是true还是false?如果是true,是不是一开始就进入了wait状态?bfull的初始化是false,怎么会变成true呢?
解决方案六:
你的程序看起来太累了,notify()唤醒在此对象监视器上等待的单个线程。wait()在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。它们都是object中的方法.
解决方案七:
5楼的姐姐,你说的wait和notify的关系,我已经搞清楚了,令我糊涂的是:在xuni类中bfull的定义是false,怎么在shen类中的run()方法中的if(xu.bfull)这里,它却是true呢?
解决方案八:
/**1>如果是true,是不是一开始就进入了wait状态?是的*2>bfull的初始化是false,怎么会变成true呢?因为它被test3.set()方法给了*这道题:你只能先set(),而不能先get(),既使你先get(),它也会被wait(),只到set()完去notify它*去看看"生产着和消费着",它里面就把wait()和notify()表达的很清楚了***/

时间: 2024-11-16 17:35:19

关于wait和notify的问题,帮忙解读一下程序!的相关文章

帮忙解读\\[[^\\]\\[]{1,5}\\]正则表达式

问题描述 帮忙解读\[[^\]\[]{1,5}\]正则表达式 如题:下面这个正则表达式是什么意思 [[^][]{1,5}] 我匹配到怎样的字符,有点郁闷,我对正则表达式不太理解,不会解读这个表达式 各位大神求解,谢谢! 解决方案 匹配方括号开头,其中没有\符号,然后又是一个方括号开头,以上模式匹配1-5次. 比如[123[123[123 这代码应该是一种蹩脚的解析json的代码

脚本编程语言-问一下这段代码是什么意思 能不能帮忙解读一下

问题描述 问一下这段代码是什么意思 能不能帮忙解读一下 <HTML> <HEAD> <TITLE> yaya.html </TITLE> <meta http-equiv="refresh" content="12;"> </HEAD> <script language="javascript"> function init() { var numbr = Mat

游戏-这个一个bat文件,用来启动一个java项目时报错。大神帮忙解读一下是什么意思。

问题描述 这个一个bat文件,用来启动一个java项目时报错.大神帮忙解读一下是什么意思. 解决方案 解释下你这个$ARGS是用来做什么的. 解决方案二: 目测args是arguments的缩写,代表一个参数,而不是实际的命令.

android-求大神帮忙解读,加点注释~谢谢

问题描述 求大神帮忙解读,加点注释~谢谢 package com.hanway.oa.activity; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashM

求qt程序帮忙解读一下。。

问题描述 求qt程序帮忙解读一下.. 解决方案 关键是要看你的协议,msg1 2 3都是怎么定义的.41 54 2B...这些东西有什么说法,这个是你的控制协议下位机定义的. 你的程序无非就是按照这个协议和下位机通讯. 解决方案二: 仅仅看这段代码的话,是在linux下,往串口写了三组数据而已

java并发-帮忙看看这个程序的输出?

问题描述 帮忙看看这个程序的输出? package thread.forkjoinpool; import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.PriorityBlockingQueue;import java.util.concurrent.TimeUnit; public class Main3 { static class

c++ 指针-c++ 请求帮忙修改一下程序 多谢!

问题描述 c++ 请求帮忙修改一下程序 多谢! 程序要实现 通过上下键能翻行 左右键翻页 程序不知哪里错了不能实现这个功能 请帮忙修改一下 多谢! #include #include #include #include #include #define MAXLINE 100 // 最大支持行数fpos_t posbefore[MAXLINE]; // 保存行开始位置char tmp[100]; // 输出缓冲区 void DisplayMenu(); // 显示菜单int ChooseMenu

c-大神们,帮忙看看这个程序标注的地方给解释一下!

问题描述 大神们,帮忙看看这个程序标注的地方给解释一下! 算法训练 Torry的困惑(基本型) 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时回答不出来.于是Torry求助于会编程的你,请你算出前n个质数的乘积.不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值. 输入格式 仅包含一个正整数n,其中n<

大神帮帮忙,这个程序的错怎么改

问题描述 大神帮帮忙,这个程序的错怎么改 /* 定义一个计算器类,要求实现加减乘除操作. / import java.util.; public class HomeWork_1110_02 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入第一个数的值:"); double a=sc.nextInt(); //从控制台接收第一个数字