如何使主方法等到我的Swing计时器完成执行?

时间:2017-07-20 11:13:03

标签: java swing

我目前正在为交叉路口进行交通管制。我创建了一个处理4个灯泡倒计时的方法。倒计时工作正常。方法的名称是start(int lane)所以我想要一些东西将方法放在一个循环中运行10次,如:

while (counter<10){
    int x = getnextlane(); // first choose a lane to run its timer
    start(x); //start running the lane's timer countdown to 0 from 10
    //I want the main thread to wait till the start(x) completes before it goes to the next line
    system.out.println("lane "+x+" is running"); 
}

我发现当我运行Gui时,倒计时开始但在它变为零之前,println语句在它之前完成。那就是:

output:
lane 1 is running
lane 2 is running
lane 3 is running
lane 4 is running
lane 1 is running
lane 2 is running
lane 3 is running
lane 4 is running
lane 1 is running
lane 2 is running

我想确保计时器在主线程跳转到下一行之前完成。

2 个答案:

答案 0 :(得分:3)

swing应用程序是一个GUI应用程序。 GUI应用程序是事件驱动的。 在事件驱动的应用程序中执行此类事物的正确方法是使用事件。

所以,你应该从你当前的方法(你描述为&#34;主要方法&#34;)开始你的计时器然后return来摆动,这样挥杆可以继续处理事件。

当一个计时器触发时,你会调用一些函数来检查你想要检查的内容,如果满足所有必要的条件,你会调用另一个函数来执行某些工作,因为所有这些条件都已满足

在GUI应用程序中,你永远不会坐在某个地方等待事情发生,因为当你这样做时,你的整个GUI都会被冻结。

另外,理论上你可以启动线程来完成这项工作,但是你需要小心,因为大多数GUI都不是线程安全的,这包括swing,所以你将无法从其他方法调用任何GUI方法线程。

答案 1 :(得分:0)

您可以使用Thread,线程调度由线程调度程序控制。因此,您无法保证正常情况下线程的执行顺序。另外,你可以等到第一个线程没有完成。

但是,您可以使用join()等待线程完成其工作。

在你的情况下,你可以把swing计时器放到Thread&amp;加入。

Thread t = new Thread(
             new Runnable() {
                 public void run () {
                     while (counter<10){
                       int x = getnextlane(); 
                       // start(x); 
                    system.out.println("lane "+x+" is running"); 
                  }
                 }
              }
);
t.start();
t.join();