停止代码直到满足条件

时间:2012-08-23 14:43:56

标签: java conditional-statements wait joptionpane thread-sleep

如何创建一个能够在满足条件之前停止所有正在运行的代码的函数或组件等?

例如,与JOptionPane一样,如果我有这个例子:

JOptionPane.showInputDialog(null, "Hello", "Title", 1);

在一个函数等中然后打印到控制台之后它将不会打印,直到我关闭JOptionPane。

我猜这个组件内置了某种线程设置但是如何用自己的函数复制它?

所以说例如我想让JFrames延迟一切,直到它被关闭,因此它就像一个JOptionPane。

或者例如有一个函数有多个输入已经更新,并在里面它做了一些数学与那些,如果它是一个特定的值返回一个布尔值,但其他一切,但那些暂停,直到返回真正的布尔值。

我猜这个解决方案是某种线程设置但是我对Java很新,当我过去编码时我没有真正使用过线程所以我无法创建一个好的stop-start / pause-run样式函数系统呢。

有没有人有任何建议如何实现这个或更好的代码示例显示这种类型的工作?

2 个答案:

答案 0 :(得分:8)

您创建了一个监视器(这只是一个简单的Object

public static final Object monitor = new Object();
public static boolean monitorState = false;

现在您创建一个等待方法

public static void waitForThread() {
  monitorState = true;
  while (monitorState) {
    synchronized (monitor) {
      try {
        monitor.wait(); // wait until notified
      } catch (Exception e) {}
    }
  }
}

以及解锁服务员的方法。

public static void unlockWaiter() {
  synchronized (monitor) {
    monitorState = false;
    monitor.notifyAll(); // unlock again
  }
}

所以当你想做一些奇特的事情时,你可以这样做:

new Thread(new Runnable() {
  @Override
  public void run() {
    // do your fancy calculations
    unlockWaiter();
  }
}).start();

// do some stuff    
waitForThread();    
// do some stuff that is dependent on the results of the thread

当然,有很多种可能性,这只是一个版本的方法。

答案 1 :(得分:1)

您是否尝试让线程睡眠?

就像Thread.sleep(timeInMilliseconds)

一样简单

检查here