看JAVA方面的书时遇到这样一个JAVA程序:
package login; class waitNOtifyDemo {
public static void main(String[ ] args){
MessageBoard m=new MessageBoard( ); //构造共享的信息板对象
Reader readfrom_m=new Reader(m);
Writer writeto_m=new Writer(m);
readfrom_m.start( );
writeto_m.start( );
}
} class MessageBoard{
private String message;
private boolean ready=false;
public synchronized String read( ){
while(ready==false){
try { wait( );}
catch (InterruptedException e){ }
}
ready=false;
notify( );
return message;
}
public synchronized void write(String s){
while(ready==true){
try { wait( );} catch (InterruptedException e){ } }
message=s; ready=true; notify( );
}
} class Reader extends Thread {
private MessageBoard mBoard;
public Reader(MessageBoard m){
mBoard=m;
}
public void run(){
String s="";
boolean reading=true;
while(reading){
s=mBoard.read();
System.out.println("Reader read:"+s);
if(s.equals("logoff")) reading=false;}
System.out.println("Finished :10 seconds...");
try{ sleep(1000);}
catch(InterruptedException e){}
}
} class Writer extends Thread{
private MessageBoard mBoard;
private String messages[]={
"星期一 :---------------------------",
"星期二 :---------------------------",
"星期三 :---------------------------",
"星期四 :---------------------------",
"星期五 :---------------------------",
"星期六 :---------------------------",
"星期日 :---------------------------"
};
public Writer (MessageBoard m){
mBoard=m;
}
public void run(){
for(int i=0;i<messages.length;i++){
mBoard.write(messages[i]);
System.out.println("Writer wrote:"+messages[i]);
try{sleep((int)(Math.random()*100));}
catch(InterruptedException e){}
}
mBoard.write("logoff");
}
}
这样一个多线程程序,
但是根据我对此程序的理解与运行结果不一样:
本人理解如下:
(1) 在类waitNOtifyDemo中启动两个线程readfrom_m.start( ); writeto_m.start( );
(2) 首先启动readfrom_m.start( );线程,调用类 MessageBoard中的 read( )函数而进入wait( ),而使线程进入阻塞.
(3) 然后writeto_m.start( )启动,调用类 MessageBoard中的 write(String s)函数, 虽然有 notify( )唤醒wait( ), 即readfrom_m.start( )从阻塞中被唤醒,但也只是从阻塞变成就绪,writeto_m.start( )仍然占用CPU,
(4) writeto_m继续执行,会输出
Writer wrote:星期一 :---------------------------
(5) 在循环中,writeto_m进入wait( ),而readfrom_m从就丛就绪进入CPU进而占用CPU,因此输出
Reader read:星期一 :---------------------------
(6) 依次类推,本人的输出结果为
Writer wrote:星期一 :--------------------------- Reader read:星期一 :--------------------------- Writer wrote:星期二 :--------------------------- Reader read:星期二 :--------------------------- Reader read:星期三 :--------------------------- Writer wrote:星期三 :--------------------------- Writer wrote:星期四 :--------------------------- Reader read:星期四 :--------------------------- Writer wrote:星期五 :--------------------------- Reader read:星期五 :--------------------------- Writer wrote:星期六 :--------------------------- Reader read:星期六 :--------------------------- Writer wrote:星期日 :--------------------------- Reader read:星期日 :--------------------------- Reader read:logoff Finished :10 seconds... 但是,运行结果为:
Reader read:星期一 :--------------------------- Writer wrote:星期一 :--------------------------- Reader read:星期二 :--------------------------- Writer wrote:星期二 :--------------------------- Writer wrote:星期三 :--------------------------- Reader read:星期三 :--------------------------- Reader read:星期四 :--------------------------- Writer wrote:星期四 :--------------------------- Reader read:星期五 :--------------------------- Writer wrote:星期五 :--------------------------- Writer wrote:星期六 :--------------------------- Reader read:星期六 :--------------------------- Writer wrote:星期日 :--------------------------- Reader read:星期日 :--------------------------- Reader read:logoff Finished :10 seconds... 不知道我的错误理解在什么地方??
请高手指点,
注: 清高手指点我应该注意的地方, 并且请多讲一下在多线程中要注意的问题,
多深入讲一下关于多线程的问题!!!!!!!
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
另外,请高手指点完以后请留下电子邮件,以防本人遇到其他问题时可以及时请教,本人将不胜感激
本人电子邮件:[email protected]>
package login; class waitNOtifyDemo {
public static void main(String[ ] args){
MessageBoard m=new MessageBoard( ); //构造共享的信息板对象
Reader readfrom_m=new Reader(m);
Writer writeto_m=new Writer(m);
readfrom_m.start( );
writeto_m.start( );
}
} class MessageBoard{
private String message;
private boolean ready=false;
public synchronized String read( ){
while(ready==false){
try { wait( );}
catch (InterruptedException e){ }
}
ready=false;
notify( );
return message;
}
public synchronized void write(String s){
while(ready==true){
try { wait( );} catch (InterruptedException e){ } }
message=s; ready=true; notify( );
}
} class Reader extends Thread {
private MessageBoard mBoard;
public Reader(MessageBoard m){
mBoard=m;
}
public void run(){
String s="";
boolean reading=true;
while(reading){
s=mBoard.read();
System.out.println("Reader read:"+s);
if(s.equals("logoff")) reading=false;}
System.out.println("Finished :10 seconds...");
try{ sleep(1000);}
catch(InterruptedException e){}
}
} class Writer extends Thread{
private MessageBoard mBoard;
private String messages[]={
"星期一 :---------------------------",
"星期二 :---------------------------",
"星期三 :---------------------------",
"星期四 :---------------------------",
"星期五 :---------------------------",
"星期六 :---------------------------",
"星期日 :---------------------------"
};
public Writer (MessageBoard m){
mBoard=m;
}
public void run(){
for(int i=0;i<messages.length;i++){
mBoard.write(messages[i]);
System.out.println("Writer wrote:"+messages[i]);
try{sleep((int)(Math.random()*100));}
catch(InterruptedException e){}
}
mBoard.write("logoff");
}
}
这样一个多线程程序,
但是根据我对此程序的理解与运行结果不一样:
本人理解如下:
(1) 在类waitNOtifyDemo中启动两个线程readfrom_m.start( ); writeto_m.start( );
(2) 首先启动readfrom_m.start( );线程,调用类 MessageBoard中的 read( )函数而进入wait( ),而使线程进入阻塞.
(3) 然后writeto_m.start( )启动,调用类 MessageBoard中的 write(String s)函数, 虽然有 notify( )唤醒wait( ), 即readfrom_m.start( )从阻塞中被唤醒,但也只是从阻塞变成就绪,writeto_m.start( )仍然占用CPU,
(4) writeto_m继续执行,会输出
Writer wrote:星期一 :---------------------------
(5) 在循环中,writeto_m进入wait( ),而readfrom_m从就丛就绪进入CPU进而占用CPU,因此输出
Reader read:星期一 :---------------------------
(6) 依次类推,本人的输出结果为
Writer wrote:星期一 :--------------------------- Reader read:星期一 :--------------------------- Writer wrote:星期二 :--------------------------- Reader read:星期二 :--------------------------- Reader read:星期三 :--------------------------- Writer wrote:星期三 :--------------------------- Writer wrote:星期四 :--------------------------- Reader read:星期四 :--------------------------- Writer wrote:星期五 :--------------------------- Reader read:星期五 :--------------------------- Writer wrote:星期六 :--------------------------- Reader read:星期六 :--------------------------- Writer wrote:星期日 :--------------------------- Reader read:星期日 :--------------------------- Reader read:logoff Finished :10 seconds... 但是,运行结果为:
Reader read:星期一 :--------------------------- Writer wrote:星期一 :--------------------------- Reader read:星期二 :--------------------------- Writer wrote:星期二 :--------------------------- Writer wrote:星期三 :--------------------------- Reader read:星期三 :--------------------------- Reader read:星期四 :--------------------------- Writer wrote:星期四 :--------------------------- Reader read:星期五 :--------------------------- Writer wrote:星期五 :--------------------------- Writer wrote:星期六 :--------------------------- Reader read:星期六 :--------------------------- Writer wrote:星期日 :--------------------------- Reader read:星期日 :--------------------------- Reader read:logoff Finished :10 seconds... 不知道我的错误理解在什么地方??
请高手指点,
注: 清高手指点我应该注意的地方, 并且请多讲一下在多线程中要注意的问题,
多深入讲一下关于多线程的问题!!!!!!!
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
不胜感激 不胜感激
另外,请高手指点完以后请留下电子邮件,以防本人遇到其他问题时可以及时请教,本人将不胜感激
本人电子邮件:[email protected]>
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货