【发布时间】:2022-01-10 15:03:00
【问题描述】:
每次客户端发送某些内容时,我都会尝试修改文件列表。它必须像服务器日志一样工作。我为 javafx 并发进行了研究,发现类 Service 和 Task 非常有用,但是当我尝试修改第二个任务的列表时,显示错误线程的错误“它不在 javafx 线程上”。有办法解决吗?我现在正在研究并发,我无法理解这个问题。谢谢。
服务器:(我在使用 conn.start() 初始化应用程序时调用 Connection conn)
public class Connection extends Service<Void>{
Socket incoming;
ServerSocket s;
PrintWriter out;
@Override
protected Task<Void> createTask() {
return new Task<>() {
@Override
protected Void call() {
System.out.println("Server Attivo");
try {
s = new ServerSocket(8189);
while (!isCancelled()) {
System.out.println("In attesa di connessione....");
incoming = s.accept();
System.out.println("after accept "+Thread.currentThread());
server = new Task<Void>() {
@Override
protected Void call() throws Exception {
System.out.println("Connessione accettata!");
System.out.println(Thread.currentThread());
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
out = new PrintWriter(outStream, true);
Scanner in = new Scanner(inStream);String line;
out.println("Connessione accettata!");
while (!isCancelled()){
line = in.nextLine();
System.out.println(line);
list.add(new Log(line)); --> the error is here
}
return null;
}
};
new Thread(server).start();
}
}catch (SocketException ex){
System.out.println("Listener chiuso!");
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void cancelled() {
System.out.println("Closing server....");
System.out.println("Done!");
if(out!=null)out.println("Connessione chiusa!");
try {
s.close();
try {
incoming.close();
}catch (NullPointerException EX){
System.out.println("Non è stata stabilita nessuna connesione client prima della chiusura!");
}
}
catch (NullPointerException EX){
System.out.println("Server non inizializzato correttamente");
}
catch (IOException e) {
e.printStackTrace();
}
if(server!=null)server.cancel();
super.cancelled();
}
};
}
}
}
【问题讨论】:
-
将
list.add(...)行换成Platform.runLater()。 -
所以...
Platform.runLater(list.add(...))? -
不,
Platform.runLater(...)expects aRunnable,所以你需要Platform.runLater(() -> list.add(...)); -
谢谢。它有效!
标签: java multithreading javafx concurrency