问题:主线程当启动子线程后,需要子线程执行完毕的结果,在子线程执行过程中主线程是不做任何操作的。我想到用wait()和notify()方法,但是主类中调用Thread.currentThread().wait();总报异常java.lang.IllegalMonitorStateException而且也没有在子线程执行完后继续执行。
子线程这么写的:在run方法最后一句Thread.currentThread().notify();另外请问join的作用,谢谢

解决方案 »

  1.   

    我准备说要你用join,这个是在等待上个线程结束后再执行的,具体的代码我不记得了,反正有点烦琐,你最好google下
      

  2.   

    子线程名.join();
    主线程操作....
      

  3.   

    join()仿佛是说等该线程跑完了才执行下面的操作吧.
      

  4.   

    嗯,join我明白了,能不能详细说说wait和notify,谢谢
      

  5.   

    有两种办法:
    1.在子线程中设置状态变量,在run()第一行设置为running,得到结果后设置为finish。主线程定时去查询子线程的状态
    当为finish时就去取结果,这样方法比较简单。但是是笨方法,主线程的查询可以认为是空耗资源。2.让主线程和子线程共享一个对象(多线程时,可以是一个该对象类型的集合),当主线程启动子线程后,
    就开始取结果,当共享对象为空时,主线程进入等待状态,子线程完成后,把结果添加到共享对象中,之后唤醒主线程。
    这样的方法比较好。这样方法最难的部分在于对哪个对象进行加锁,正确的方法应该是锁共享对象,而不是锁主线程或子线程。附个简单例子:(临时写的可能有问题)public class ParentThread extends Thread{
       public static LinkedList<Result> resultList= new LinkedList<Result>();
       
       @Override
       public void run(){
           ChildThread thread = new ChildThread();
           thread.start();
           Result result = getResult();
           .......//你处理结果的代码
       }   private Result getResult(){
          Result result = null;
          synchronized(resultList){
     while(resultList.isEmpty()){
        try {
    resultList.wait();
    } catch (InterruptedException e) {}
        }
     result = resultList.poll();
           }
          return result;
       }
    }
    public class ChildThread extends Thread{
        private LinkedList<Result> resultList = ParentThread.resultList;
        @Override
        public void run(){
           Result result = .....//你自己处理过程
            putResult(result);
        }    private void putResult(Result result){
            synchronized(resultList){
                resultList.add(result);
                resultList.notifyAll();
    }
        }
    }写完发现竟然写了半小时。
      

  6.   

    看看
    java.util.concurrent 
    中的Future能解决你的问题吗