如何让EDT线程工作完后再运行主线程

Greentea107 2013-05-10 11:00:27
自定义了一个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界面,但并不指出是哪里出错,然后就死机了,这是什么原因啊
...全文
203 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Greentea107 2013-05-10
  • 打赏
  • 举报
回复
我归纳下我的问题,程序在运行时默认就有了一个main的线程,然后再运行Swing组件时把组件的内容加载到EDT线程里用SwingUtilities.invokeLate里,但这就造成了主线程与EDT线程是异步运行,各自运行各自的代码。我现在需要执行一段代码必须要EDT里相应的代码运行完毕后主线程才能继续运行,有什么办法,我现在用这个方法,但是发现行不能啊 synchronized(主线程) { Swing组件运行完毕后 主线程.notify() } synchronized(主线程) { while(Swing线程中相应的代码尚未执行完毕) wait(); }
Greentea107 2013-05-10
  • 打赏
  • 举报
回复
具体该怎么用啊?能写清楚点吗
zhaogang 2013-05-10
  • 打赏
  • 举报
回复
用java.util.concurrent.CountDownLatch 不用合并线程也可以。在主线程里声明,他会阻塞在await方法处,等待所有的子线程运行完毕,再执行下面的代码。 具体用法,可以查帮助
Greentea107 2013-05-10
  • 打赏
  • 举报
回复
按理说join应该是先start()再调用join()的,但问题是我如何在EDT里调用join?难道在SwingUtilities.invokeLater里用Thread.currentThread.join()?那又如何保证EDT线程里的对象已经运行了?
shoulders 2013-05-10
  • 打赏
  • 举报
回复
google一下thread join的用法,用了join,主线程就会等那个join的线程执行完了。
zhaogang 2013-05-10
  • 打赏
  • 举报
回复
楼主,没查看过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类

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧