进行服务检查以查看它是否已在 JavaFx 中安排或 运行

Make a service check to see if it's already scheduled or running in JavaFx

我正在编写一个蓝牙消息传递程序作为 JavaFX 8 桌面应用程序的一部分。我正在使用来自 javafx.concurrent 的服务 class 来编写和读取消息,因此我的 UI 线程不会被工作淹没。我的代码如下:

public MessageHandler(String url){
    this.url = url;
    try {
        StreamConnection streamConnection=(StreamConnection)Connector.open(url);

        OutputStream outStream=streamConnection.openOutputStream();
        outData = new DataOutputStream(outStream);

        InputStream inStream=streamConnection.openInputStream();
        inData = new DataInputStream(inStream);

        writer = new Writer();
        reader = new Reader();
    } catch (IOException e){
        e.printStackTrace();
    }
}

public void write(String message){

    writer.setMessage(message);
    writer.start();
}

public String read(){
    reader.start();
    return reader.getValue();
}

class Reader extends Service<String>{

    @Override
    protected Task<String> createTask() {

        return new Task<String>(){

            @Override
            protected String call() throws Exception {

                return inData.readUTF();
            }

        };
    }

}

class Writer extends Service<Void>{
    String message;
    public final void setMessage(String message){this.message = message;}
    public final String getThisMessage(){
        return this.message;
    }

    @Override
    protected Task<Void> createTask() {
        final String _message = getThisMessage();
        return new Task<Void>(){

            @Override
            protected Void call() throws Exception {
                outData.writeUTF(_message);
                return null;
            }
        };
    }
}
}

最初我计划让每次调用 read() 或 write() 形成一个新的服务实例,但决定不这样做,因为我不能同时进行多个读取或写入。这就是为什么我将 'reader' 和 'writer' 设为实例变量的原因。我的主要 class 中的代码如下所示。

MessageHandler mssgHandler = new MessageHandler(connectDevice.get());
mssgHandler.write("@");
mssgHandler.write("abfjsd");
System.out.println(mssgHandler.read());
mssgHandler.write("!");

当我 运行 我的程序使用此代码时,我得到:

java.lang.IllegalStateException: Can only start a Service in the READY state. Was in state SCHEDULED

这是有道理的。我需要一种方法让服务检查它是否已经安排好或 运行ning 在它 运行s 之前再次检查,并等待它尚未准备好。这也必须适用于两种服务,即 Reader 应该检查 Writer 是否在做某事,反之亦然。我知道存在 isRunning() 方法,但据我所知,它不会检查它是否已安排,这正是我现在遇到的问题。

感谢您的帮助!

已解决:

我添加了一个队列并更改了代码,因此它仅在前一个成功时才开始下一个 write/read。

您可以使用 getState() on your Service, which will return you the current state of the Worker.