停止代码直到满足条件

zed*_*dex 4 java joptionpane wait conditional-statements thread-sleep

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

例如,与JOptionPane相同的方式,如果我有这样的例子:

JOptionPane.showInputDialog(null, "Hello", "Title", 1);
Run Code Online (Sandbox Code Playgroud)

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

我猜这个组件有内置的某种线程设置,但我怎么能用我自己的函数复制它?

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

或者例如有一个具有多个输入的函数,这些函数已经更新,并且在其内部对它们进行了一些数学计算,如果它是某个值返回一个布尔值,但是除了那些之外的其他所有内容都会暂停,直到返回真正的布尔值.

我猜这个解决方案是某种线程设置,但我对Java很新,当我在过去编写代码时,我还没有真正使用过线程,所以我无法创建一个好的停止 - 启动/暂停 - 运行样式函数系统.

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

bri*_*ium 8

你创建一个监视器(这只是一个简单的Object)

public static final Object monitor = new Object();
public static boolean monitorState = false;
Run Code Online (Sandbox Code Playgroud)

现在,您创建一个等待方法

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

以及解锁服务员的方法.

public static void unlockWaiter() {
  synchronized (monitor) {
    monitorState = false;
    monitor.notifyAll(); // unlock again
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

当然,有很多可能性,这只是一个版本如何做到这一点.

  • 应该始终在循环中调用`wait()`,如Javadoc所述. (2认同)