Java 如何使主方法等待Swing计时器完成执行?

Java 如何使主方法等待Swing计时器完成执行?,java,swing,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 fr

我目前正在为一个交叉路口的交通管制工作。我创建了一个方法来处理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"); 
}

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

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

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

在您的情况下,您可以将swing计时器设置为线程和DoJoin

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(); 
Thread t=新线程(
新的Runnable(){
公开作废运行(){

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

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

在您的情况下,您可以将swing计时器设置为线程和DoJoin

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(); 
Thread t=新线程(
新的Runnable(){
公开作废运行(){

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

因此,您应该启动计时器,然后
从当前方法(您称之为“主方法”)返回到swing,以便swing可以继续处理事件

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

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


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

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

因此,您应该启动计时器,然后
从当前方法(您称之为“主方法”)返回到swing,以便swing可以继续处理事件

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

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


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

你尝试过线程吗?@AbdullahKhan:上面的评论都不正确。请参阅Mike的答案,以获得更好、更安全的解决方案解决方案。上面的问题也提到了Swing Timer,但没有提到在哪里显示Swing Timer代码。相反,您显示了一个while循环,虽然适用于线性控制台应用程序,但在事件驱动的GUI环境(如Swing)中不会很好地工作。请阅读-总结是,这不是解决志愿者问题的理想方法,可能是对于获得答案来说,这可能会适得其反。请不要将此添加到您的问题中。@asettouf:我可以向您保证,我绝对有信心(和多年的经验)在这种情况下,OP绝对不想使用
线程。join
。你可以不同意,但根据我个人的经验,这样做会使代码更复杂,更容易出现错误,因为在创建自己的非SwingWorker线程时,OP现在必须努力确保在EDT上进行所有Swing调用。这都是simp通过正确使用Swing计时器和事件通知(如通过“绑定”)大大提高了性能属性。您是否尝试了线程?@AbdullahKhan:以上两条评论都不正确。请参阅Mike的答案,以获得更好、更安全的解决方案。此外,您上面的问题提到了Swing Timer,但没有在何处显示Swing Timer代码。相反,您显示了一个while循环,该循环虽然适用于线性控制台应用程序,但在线性控制台应用程序中无法正常工作n事件驱动的GUI环境,如Swing。请阅读-总结是,这不是解决志愿者问题的理想方式,可能会对获得答案产生反作用。请不要将此添加到您的问题中。@asettouf:我可以向您保证绝对有信心(以及多年的经验)在这种情况下,OP绝对不想使用
线程。join
。你可以不同意,但根据我个人的经验,这样做会使代码更复杂,更容易出现错误,因为在创建自己的非SwingWorker线程时,OP现在必须努力确保在EDT上进行所有Swing调用。这都是simp通过正确使用Swing计时器和事件通知(如通过“绑定”)大大提高了性能属性。您的答案不适用于Swing GUI库,因为正确的解决方案不是使用线程连接,而是按照Mike Naki的正确答案使用事件通知。您的答案不适用于Swing GUI库,因为正确的解决方案不是使用线程连接,而是按照Mik使用事件通知