如何让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界面,但并不指出是哪里出错,然后就死机了,这是什么原因啊
...全文
242 6 打赏 收藏 转发到动态 举报
写回复
用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类
内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。

62,622

社区成员

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

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