明月松间照 清泉石上流


                                        ——— 兵临城下   猫科动物
posts - 70, comments - 137, trackbacks - 0, articles - 23
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
看一下下面这段程序
package com.xcblcx.test;

import java.util.ArrayList;

public class ThreadNotifyTest {
    
private ArrayList list = new ArrayList();

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        ThreadNotifyTest test 
= new ThreadNotifyTest();
        Queue queue 
= test.new Queue();
        
try{
            Thread.sleep(
1000);
            
for(int i=0;i<5;i++{
                queue.addStr(
new Integer(i).toString());
                Thread.sleep(
1000);
            }

        }
catch(Exception e) {
            e.printStackTrace();
        }

    }

    
    
class ThreadTest extends Thread {
        Queue queue 
= new Queue();
        
        
public ThreadTest() {
            
//this.queue = queue;
        }

        
public void run() {
            
while(true{
                
try{
                    System.out.println(
"Thread start .");
                    String testStr 
= this.queue.getNext();
                    System.out.println(testStr);
                }
catch(Exception e ){
                    e.printStackTrace();
                }

            }

        }

    }

    
    
class Queue {
        
private ThreadTest threadTest = null;
        
        
public Queue(){
            
//this.threadTest = new ThreadTest(this);
            this.threadTest = new ThreadTest();
            
this.threadTest.start();
        }

        
        
public void addStr(String str) {
            
synchronized(list) {
                list.add(str);
                list.notify();
            }

        }

        
        
public String getNext() throws InterruptedException {
            
synchronized(list) {
                
while(list.size() <= 0{
                    System.out.println(
"wait start");
                    list.wait();
                    System.out.println(
"wait end");
                }

                
                
return (String)list.remove(0);
            }

        }

    }


}



运行结果为:
java.lang.StackOverflowError
Exception in thread "main"
请问为什么?

评论

# re: 五一前最后一贴!发现一个问题,搞不明白,上来求助!  回复  更多评论   

2008-05-01 10:28 by 隔叶黄莺
产生互相循环调用,看

new Queue() 时 new 了 ThreadTest(),而 new ThreadTest() 时又 new 了 Queue() ,继而再 new ThreadTest(),循环不已,无穷尽也

你需要在 new Queue() 时传递一个已创建好的 ThreadTest 实例,如这样的构造

public Queue(ThreadTest threadTest){
this.threadTest = threadTest;
}

在 ThreadTest 构造方法中就不用处理 Queue 的创建了,或者他们的职责换一下也行。

# re: 五一前最后一贴!发现一个问题,搞不明白,上来求助!  回复  更多评论   

2008-05-02 15:33 by 兵临城下
明白了,谢了!

只有注册用户登录后才能发表评论。


网站导航: