如何";暂停“;在Java中状态发生变化之前,应用程序是否正常运行?

如何";暂停“;在Java中状态发生变化之前,应用程序是否正常运行?,java,Java,我必须“暂停”我的应用程序,直到套接字接收到来自其他应用程序的特定消息 public class Status { public static boolean ready = false; } public class Application { public void method() { // do job // wait other app is ready while(Status.ready == false)

我必须“暂停”我的应用程序,直到套接字接收到来自其他应用程序的特定消息

public class Status {
    public static boolean ready = false;
}

public class Application
{
    public void method()
    {
       // do job
       // wait other app is ready

       while(Status.ready == false)
       {
           // do nothing

           // [[ 1 ]] 
       }

       // continue

    }
}

public class SocketImpl extends Thread
{
   ...
   // It is expected that the other program is ready
   public void run()
   {
      // receive some msg
      // if it's ready message
      Status.ready = true;
   }
}
好吧,我想你明白我在做什么了,现在有两个问题

  • 正确地使用它吗?最佳实践是什么
  • 关于java机制,为什么my while()在此配置中不检测布尔值的更改状态?为什么我要用
    System.out.println(Status.ready)
    替换
    /[[1]]]

  • 添加
    println
    允许
    while
    检测状态变化。为什么?我无法解释这一点。

    这种繁忙的等待方式并不好。您应该实现观察者模式,这样当SocketImpl有消息时,它会通知其连接的观察者

    首先定义一个观察者接口:

    interface SocketObserver {
         public void MessageReceived(Object aMessage);
    }
    
    其中,aMessage可能是保存消息数据的自定义类的实例

    然后在SocketImpl中定义一个观察者(可以使用arraylist支持muliple)

    然后,在启动线程之前,请设置observer属性

    SocketImpl socket = new SocketImpl();
    socket.setObserver(new SocketObserver() {
          @Override
          public void MessageReceived(Object message) {
                  //Message received do something with it
          }
    });
    
    socket.start();
    
    您可以在此处看到实现观察者模式的更多信息:

    这种繁忙的等待方式并不好。您应该实现观察者模式,这样当SocketImpl有消息时,它会通知其连接的观察者

    首先定义一个观察者接口:

    interface SocketObserver {
         public void MessageReceived(Object aMessage);
    }
    
    其中,aMessage可能是保存消息数据的自定义类的实例

    然后在SocketImpl中定义一个观察者(可以使用arraylist支持muliple)

    然后,在启动线程之前,请设置observer属性

    SocketImpl socket = new SocketImpl();
    socket.setObserver(new SocketObserver() {
          @Override
          public void MessageReceived(Object message) {
                  //Message received do something with it
          }
    });
    
    socket.start();
    
    您可以在此处看到实现观察者模式的更多信息:

    不,这不是一个好方法——它被称为忙等待。你可能想使用某种通知。好吧,关于这种方法,它真的很难看。考虑到这一点,即使这是一个糟糕的方法,问题2呢?我特别要求它,我怀疑这是一个错误的方法。看到你可以考虑一个或一个,但<代码>观察员<代码>模式会更好。方法是丑陋的,但这是一些测试,这就是为什么我没有实现某种观察者模式,易失性关键字是解决方案,这不是一个好方法——它被称为忙等待。你可能想使用某种通知。好吧,关于这种方法,它真的很难看。考虑到这一点,即使这是一个糟糕的方法,问题2呢?我特别要求它,我怀疑这是一个错误的方法。看到你可以考虑一个或一个,但<代码>观察员<代码>模式会更好。方法是丑陋的,但这是一些测试,这就是为什么我没有实现某种观察者模式,易失性关键字是解决方案。