multithreading - 使用 javafx.concurrent 的 JavaFX 网络后台任务

标签 multithreading service concurrency task javafx

我正在实现一个 JavaFX 应用程序,它通过 wifi (android) 与手机通信。

因此,我在 JavaFX 上有一个服务器线程在后台进程中运行:

public class NetworkService implements Runnable { 

    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    private RoutePlannerJFX application;
    private UserData userData;


    public NetworkService(ExecutorService pool,
                          ServerSocket serverSocket,
                          RoutePlannerJFX app,
                          UserData data) {
        this.serverSocket = serverSocket;
        this.pool = pool;
        application = app;
        userData = data;
    }


    public void run() {
        try {
            while ( true ) {
                Socket cs = serverSocket.accept(); 
                pool.execute(new Handler(serverSocket, cs, application, userData));
            }
        } catch (IOException ex) {
            System.out.println("--- Interrupt NetworkService-run");
        }
        finally {
            System.out.println("--- Ende NetworkService(pool.shutdown)");
            pool.shutdown();  //keine Annahme von neuen Anforderungen
            try {
                pool.awaitTermination(4L, TimeUnit.SECONDS);
                if ( !serverSocket.isClosed() ) {
                    System.out.println("--- Ende NetworkService:ServerSocket close");
                    serverSocket.close();
                }
            } catch ( IOException e ) { }
            catch ( InterruptedException ei ) { }
        }
    }
}

它有一个处理程序:

public class Handler implements Runnable {

    private final Socket client;
    private final ServerSocket serverSocket;

    private RoutePlannerJFX application;
    private UserData userData;


    Handler(ServerSocket serverSocket,Socket client, RoutePlannerJFX app, UserData data) {
        this.client = client;
        this.serverSocket = serverSocket;
        application = app;
        userData = data;
    }


    public void run() {
        StringBuffer sb = new StringBuffer();
        PrintWriter out = null;
        try {
            System.out.println( "running service, " + Thread.currentThread() );
            out = new PrintWriter( client.getOutputStream(), true );
            BufferedReader bufferedReader = 
                new BufferedReader(
                    new InputStreamReader(
                        client.getInputStream()));
            char[] buffer = new char[100];
            int anzahlZeichen = bufferedReader.read(buffer, 0, 100); 
            String nachricht = new String(buffer, 0, anzahlZeichen);
            String[] werte = nachricht.split("\\s");


            System.out.println(nachricht+"\n");

            POI poi = new POI(nachricht);
            userData.addItemToPoiList(poi);

            application.setScene("INSTRUCT");

        } catch (IOException e) {System.out.println("IOException, Handler-run");}
        finally { 
            System.out.println(sb);  //Rückgabe Ergebnis an den Client
            if ( !client.isClosed() ) {
            System.out.println("****** Handler:Client close");
            try {
                client.close();
                } catch ( IOException e ) { }
            } 
        }
    }
}

应用程序有一个公共(public)方法来更改场景 (setScene())。

这就是我希望能够做到的方式,但现在我知道,我无法在后台进程中切换场景。

有人知道如何解决这个问题吗?当我的后台进程收到来自客户端的消息时,我需要触发一个操作,但我不知道最好的方法是什么......我已经找到了 javafx.concurrent,但我必须使用哪个以及如何使用?

提前致谢!

最佳答案

对于客户端,您可以使用任务或服务在单独的线程中运行并更新 GUI,如 documentation 中所述。

你也可以查看这篇文章JavaFX Async Task

关于multithreading - 使用 javafx.concurrent 的 JavaFX 网络后台任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239664/

相关文章:

Python - 具有多个数组的多线程,将参数传递给函数

java - 如何在 Windows 下的 Java 服务中添加时间戳 GC 日志文件名?

azure - 使用自定义 DNS 将 Azure Pack 连接到 Windows Server 的服务总线

iphone - 最大线程限制?

C 客户端/服务器套接字错误

java - Java 中通知和等待的顺序

java - 嵌套 Scala Future 是否需要托管阻塞?

java - 有关解释死锁的 oracle.com 并发代码的问题

python - 类图像没有属性 'fromarray'

java - 在我的服务中,我想通过另一个服务加载路径