我目前正在为交叉路口进行交通管制。我创建了一个处理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
我想确保计时器在主线程跳转到下一行之前完成。
答案 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();