java - 在不同线程中启动的 ServerSocket 使 JavaFX 应用程序冻结
问题描述
我正在尝试使用 pty.js 和 xterm.js 创建一个终端模拟器。我以前从未尝试过这样的事情,所以如果我说错了,我道歉,这是因为我没有正确理解它。无论如何,终端应该显示在 JavaFXWebView
中,并且所有 GUI 都已准备好并经过测试。根据我的发现,我了解到必须在 localhost 上运行一个服务器,以便 pty.js 在那里生成一个 shell,并通过 xterm.js 在WebView
. 现在,我正在尝试创建一个使用ServerSocket
新的服务器Thread
但是当我测试应用程序并单击终端按钮时,应用程序会冻结。我已经通过访问我的本地主机测试了服务器是否正在运行,并且它已经启动并正在运行。所以,我得到的是应用程序的主线程在服务器线程启动时优先级较低。我对吗?如果是这样,我该如何解决这个问题?
下面的函数在initialize
从主控制器加载的终端场景的方法中调用。有人可以解释为什么会这样吗?
private void createServerToSpawnPty() {
Thread thread = new Thread(() -> {
try {
ServerSocket server = new ServerSocket(8080);
System.out.println("Created Java localhost server on port: 8080");
while (true) {
final Socket client = server.accept( );
System.out.println("client connected:+
client.isConnected( ));
}
}catch (IOException exception) {
exception.printStackTrace( );
}
});
thread.setDaemon(true);
thread.run();
}
解决方案
这两个链接都提供了非常有用的信息,所以感谢你们俩。由于该服务器不会等待来自除 之外的任何其他客户端的连接WebView
,因此我最终以另一种方式实现了该方法,更具体地说,我删除了 while 循环并将所有内容包装在一个Task
无论如何都在后台运行并且也可以通过到ExecutorService
.
private void startServerToSpawnPty() {
Task<Void> serverTask = new Task<Void>( ) {
@Override
protected Void call() throws Exception {
ServerSocket server = new ServerSocket(8080);
System.out.println("Created Java localhost server on port: 8080");
final Socket client = server.accept( );
if (client.isConnected( )) {
System.out.println("client connected: " + client.isConnected( ));
System.out.println("You just connected with the Java localhost" +
"server on port: 8080");
} else
System.out.println("No connection found");
return null;
}
};
ExecutorService service = Executors.newFixedThreadPool(1);
service.execute(serverTask);
service.shutdown();
}
推荐阅读
- python - PyGame:camera.set_controls() 在 RasPI 上不起作用
- python - 在 Python 中使用 Keras 将 27 个字段的输入连接到 LSTM 层的输出
- mysql - 无法提高查询的查询性能
- sitecore - 移动设备上的 Sitecore 缓存问题(Ipad-I 手机)
- c - fgets() 是否锁定标准输出以防止 printf
- hana - SAP HANA 查询中涉及参数和变量的“国家”字符(unicode)
- templates - Vue.js 本地模板变量
- laravel - Laravel Nova 1 个资源中的 2 个模型
- python - 火炬就地操作以节省内存(softmax)
- python-3.x - 在 anaconda 环境中选择 python 版本