自定义了一个StartDialog的类,是继承自JDialog的,这个类主要是实现一个启动界面,我在程序里实例的时候是放在EDT线程里的,想要在这个类显示后再让主线程运行该怎么做?我目前是这样写的
public ManagerCenter()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
dlgStart = new StartDialog(ManagerCenter.this);
}
});
synchronized (this)
{
while (dlgStart == null || dlgStart.isVisible() == false)
try
{
this.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可一运行就会进入DEBUG界面,但并不指出是哪里出错,然后就死机了,这是什么原因啊

解决方案 »

  1.   

    google一下thread join的用法,用了join,主线程就会等那个join的线程执行完了。
      

  2.   

    按理说join应该是先start()再调用join()的,但问题是我如何在EDT里调用join?难道在SwingUtilities.invokeLater里用Thread.currentThread.join()?那又如何保证EDT线程里的对象已经运行了?
      

  3.   

    用java.util.concurrent.CountDownLatch
    不用合并线程也可以。在主线程里声明,他会阻塞在await方法处,等待所有的子线程运行完毕,再执行下面的代码。
    具体用法,可以查帮助
      

  4.   

    我归纳下我的问题,程序在运行时默认就有了一个main的线程,然后再运行Swing组件时把组件的内容加载到EDT线程里用SwingUtilities.invokeLate里,但这就造成了主线程与EDT线程是异步运行,各自运行各自的代码。我现在需要执行一段代码必须要EDT里相应的代码运行完毕后主线程才能继续运行,有什么办法,我现在用这个方法,但是发现行不能啊
    synchronized(主线程)
    {
     Swing组件运行完毕后
     主线程.notify()
    }
    synchronized(主线程)
    {
     while(Swing线程中相应的代码尚未执行完毕)
      wait();
    }
      

  5.   

    楼主,没查看过Java帮助文档吗??
    示例用法: 下面给出了两个类,其中一组 worker 线程使用了两个倒计数锁存器:    第一个类是一个启动信号,在 driver 为继续执行 worker 做好准备之前,它会阻止所有的 worker 继续执行。
        第二个类是一个完成信号,它允许 driver 在完成所有 worker 之前一直等待。  class Driver { // ...
       void main() throws InterruptedException {
         CountDownLatch startSignal = new CountDownLatch(1);
         CountDownLatch doneSignal = new CountDownLatch(N);     for (int i = 0; i < N; ++i) // create and start threads
           new Thread(new Worker(startSignal, doneSignal)).start();     doSomethingElse();            // don't let run yet
         startSignal.countDown();      // let all threads proceed
         doSomethingElse();
         doneSignal.await();           // wait for all to finish
       }
     } class Worker implements Runnable {
       private final CountDownLatch startSignal;
       private final CountDownLatch doneSignal;
       Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
          this.startSignal = startSignal;
          this.doneSignal = doneSignal;
       }
       public void run() {
          try {
            startSignal.await();
            doWork();
            doneSignal.countDown();
    } catch (InterruptedException ex) {} // return;
       }   void doWork() { ... }
     } 以上代码来自java帮助文档的java.util.concurrent.CountDownLatch类