Java 仅在条件为真后执行

Java 仅在条件为真后执行,java,asynchronous,wait,execution,Java,Asynchronous,Wait,Execution,我在下面粘贴了一个java代码: package lreal.server; import fb.datatype.LREAL; import fb.rt.AbstractEvent; import fb.rt.EventServer; import fb.rt.FBRManagementException; import fb.rt.net.SERVER; import java.util.*; public class Double5 { public SERVER serve

我在下面粘贴了一个java代码:

    package lreal.server;

import fb.datatype.LREAL;
import fb.rt.AbstractEvent;
import fb.rt.EventServer;
import fb.rt.FBRManagementException;
import fb.rt.net.SERVER;
import java.util.*;

public class Double5 {

public SERVER server = new SERVER(0, 1); // creating a server

static LREAL rd1 = new LREAL(); // the variable in which the value received
                                // from client is stored
// it is initialized to zero on declaration.
public double m;



public Double5() {
    // initialize the service / server
    server.QI.value = true;
    server.ID.value = "10.0.0.3:4410";
    server.INIT.serviceEvent(null);

    try {
        // establishing connection to the client.
        server.connectOV("RD_1", rd1);
    } catch (FBRManagementException e1) {
        e1.getMessage();
    }

    // Set up output event handling
    final EventServer initoServer = new AbstractEvent() {
        @Override
        public void serviceEvent(EventServer e) {

            System.out.println("INITO(QO=" + server.QO + ",STATUS= "
                    + server.STATUS + "RD_1= " + rd1);



        }
    };
    server.INITO.connectTo(initoServer);

    server.IND.connectTo(new AbstractEvent() {
        @Override
        public void serviceEvent(EventServer e) {
            initoServer.serviceEvent(e);

            System.out.println("INDICATE(QO=" + server.QO + ",STATUS= "
                    + server.STATUS + "RD_1= " + rd1.value);
            m = rd1.value;


            System.out.println(" value recived inside is " + rd1);

            server.QI.value = false;
            server.INIT.serviceEvent(null);

        }

    });





}

public static void main(String[] args) {
    Double5 demo1 = new Double5();
    synchronized (demo1) {
        while (demo1.m == 0) {
            try {

                System.out.println(" zero value received");
                demo1.wait();
            } catch (InterruptedException e2) {
                e2.getMessage();
            }

        }
        System.out.println(demo1.m);
        demo1.notify();

    }
}
}

这是我得到的输出:

 zero value received
INITO(QO=true,STATUS= "OK"RD_1= 45.65
INDICATE(QO=true,STATUS= "OK"RD_1= 45.65
 value recived inside is 45.65
INITO(QO=false,STATUS= "TERMINATED"RD_1= 45.65
本质上,这个程序所做的是创建一个服务器,从客户端接受一个值。接收到的值存储在类LREAL()的实例rd1中。运行此代码后,我初始化另一个软件FBDK上的客户端。编码用于与该软件通信

因此,首先执行initoserver,然后执行indserver


我的疑问是:我写了一个声明,名为m=rd1.value。值的类型为double。当我运行这个程序时,m被存储为零。然而,它应该具有客户端发送的值(在本例中为45.65)。我想知道在main方法中初始化对象demo1之后,是否有办法阻止print语句的执行,直到45.65的值存储在m中。我希望以异步方式完成它。我查看了wait和notify方法,但不确定它们是否可以像在本例中那样使用,因为我希望在同一个类中控制执行。多谢各位

我刚才试过使用while循环,结果成功了。我能够解决它。我想我不必深入同步。结果比那简单。无论如何,谢谢你的帮助和见解。谢谢

public static void main(String[] args) {
    Double5 demo1 = new Double5();

while (demo1.m==0)
{
System.out.println(" zero value received");
}


System.out.println(" value received is "+ demo1.m);     


}

请正确格式化您的源代码并使其尽可能简洁,即删除包含停用代码的注释。这表明你在问题上付出了努力,使你更有可能得到答案。作为旁注,java惯例是用CamelCase编写类名。坚持一种语言的惯例会使代码对主要受众更具可读性,从而更易于维护。您是否尝试过
wait
notify
(而不是仅仅查看它们)?我不明白为什么它不能工作,尽管我真的不确定你的代码是什么。请按照建议正确格式化源代码(例如,如果你在eclipse中,请按Ctrl+Shift+F)。仍然很难遵循代码。另外,现在我可以阅读代码了,我注意到您没有提供程序输出。这样可以更容易地查看代码的工作方式,因为我们不知道事件是如何或何时触发的。我们已经做了必要的更改。我一直在尝试使用wait()和notify()来实现我的目标。但仍然没有区别。非常感谢您的意见和见解。非常感谢。