Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 程序在继续循环之前不等待计时器完成_Java_Multithreading_Time_Sleep - Fatal编程技术网

Java 程序在继续循环之前不等待计时器完成

Java 程序在继续循环之前不等待计时器完成,java,multithreading,time,sleep,Java,Multithreading,Time,Sleep,每当您单击我的程序上的开始按钮时,我都会运行以下代码。我已经通过注释指出了我想要定时器去哪里,问题是,当我执行thread.sleeptime时,它会冻结我的程序!所以,我想知道someoen是否可以简单地将atimer添加到我的代码中,让它运行第一位,等待,然后基于bumpNum再次运行它 代码: 然后: 根据用户的输入,它将等待多少秒stxtwait1,然后重复上面的发布代码,直到达到bumpNum 每次程序无法冻结时,它都会用以下内容更新txtLog: txtLog.append("Boa

每当您单击我的程序上的开始按钮时,我都会运行以下代码。我已经通过注释指出了我想要定时器去哪里,问题是,当我执行thread.sleeptime时,它会冻结我的程序!所以,我想知道someoen是否可以简单地将atimer添加到我的代码中,让它运行第一位,等待,然后基于bumpNum再次运行它

代码:

然后: 根据用户的输入,它将等待多少秒stxtwait1,然后重复上面的发布代码,直到达到bumpNum

每次程序无法冻结时,它都会用以下内容更新txtLog:

txtLog.append("Board Bumped. Waiting "+ ((Integer)(wait/1000)).toString() +" Seconds..." + "\n");
编辑:

唉。好了,现在我明白了。我不知道答案。您正在谈论绘制GUI元素。我怀疑您想要分叉一个线程来完成一项工作,然后向GUI显示您正在等待它。您需要等待线程完成在GUI元素刷新时始终看到下面的my join代码,直到它在显示某些结果时完成

这更多地取决于GUI代码,而不是睡眠/计时器。我现在要开始一个新问题并解释!!!没有代码!!!但是用伪代码从1000英尺的高度看你想要什么。比如:

 Thread thread = new Thread(new Counter(wait));
 thread.start();
 thread.join();
我正在尝试在[Swing/Android/etc]的后台运行一个线程。我想向用户显示线程已经分叉,我想让用户界面等待线程而不冻结,然后我想让用户界面加入线程并显示结果

像我们必须思考的那样思考这个问题。预测我们将提出的问题。找出我们对您的环境不了解和不了解的地方

祝你好运

编辑:

如果你只是想打电话给sleep,那么你就不必为此费口舌了。您需要在代码中执行的所有操作是:

  try {
      Thread.sleep(waitingTime);
      System.out.println(waitingTime);
  } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
      e.printStackTrace();
  }
这将暂停可能是主线程的当前线程等待时间(毫秒)

所以你很快就分叉了3个线程,我想你不想这么做。如果您试图等待每个线程完成,则必须执行以下操作:

 Thread thread = new Thread(new Counter(wait));
 thread.start();
 thread.join();
其他几点意见:

在类的构造函数中启动线程被认为是错误的:new Threadthis.start; 您正在Runnable中创建2个线程对象。您应该在Runnable之外创建一个。见上文

Thread myCounter = new Thread(this);  << #1
public Counter(int waitingTime) {
   new Thread(this).start();          << #2
}
当您发现InterruptedException时,请确保正确处理它。一个好的模式是重置中断标志和/或退出线程:

} catch (InterruptedException e) {
    // resets the interrupt flag cleared by catching the exception
    Thread.currentThread.interrupt();
    // or stops the thread immediately
    return;
}

每次通过循环都会启动一个新线程。不要在构造函数中创建新线程,而是将do/while循环移动到新线程的普通方法而不是run方法中。您所做的是生成一个新线程,该线程实际上处于睡眠状态,但执行循环的不是该线程,因此该线程将继续正常运行。

您试图实现什么?如果您只想在每次循环迭代后睡眠3秒钟,那么您不需要线程,只需在循环中就睡在那里。调用thread.sleep1000不需要在线程中;我希望它遍历循环一次,等待wait变量指示的时间,然后重复,直到循环达到其目标的遍历量。当我执行Thread.sleep时,程序冻结。我是在GUI.java类中完成这一切的,那么就在一个工作线程中完成这一切,并在该线程中进行正常睡眠?或者考虑一下使用摆动计时器,你想完成什么?不要考虑代码,因为您感到困惑,我们无法理解您试图做什么。当你的程序到达这里添加计时器时,你希望它做什么?大多数问题的底线是你不应该调用线程。睡眠。。。在摇摆线上。有更好的方法可以使用SwingWorker、其他后台线程或Swing计时器来完成这类工作,选择哪种方法取决于您试图解决的总体问题的细节,而不是您的代码尝试。对不起,这是一个非常糟糕的问题,它是非常不完整和混乱的。在将来,你会想花更多的时间来澄清你到底想做什么。谢谢你的回答,但我只是在学习Java,所以这对我来说很困惑。我将在上面的GUI中发布按钮的完整代码。在我的作品@user1176922中,我已经编辑了我的答案,以防你想暂停一下。代码在你文章的顶部。每次31秒。使用您的代码,我按下开始按钮,它执行一次操作,暂停31秒…不重复操作…暂停31秒…不重复操作…暂停31秒。然后解冻,然后添加日志。我用我的主要目标编辑了我的OP。它在奥波克的底部。我想我知道发生了什么@user1176922。您希望看到等待的消息。你不会的,因为这会 睡觉后。如果你想让你的程序休眠,那么它将冻结,即休眠。如果你想让它睡在一个线程中,那么它根本不会等待。请休息一下,编辑你的问题,告诉我们你想完成什么。
    int waitingTime;                    << remove the =0 here
    public Counter(int waitingTime) {
       this.waitingTime = waitingTime;
} catch (InterruptedException e) {
    // resets the interrupt flag cleared by catching the exception
    Thread.currentThread.interrupt();
    // or stops the thread immediately
    return;
}