【问题标题】:Cannot add elemento cause it's not a JAVAFX thread无法添加 elemento,因为它不是 JAVAFX 线程
【发布时间】: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();
            }

         };
      }
   }
}

【问题讨论】:

标签: java multithreading javafx concurrency


【解决方案1】:

Platform.runLater(() -&gt; list.add(...)); 解决了我的问题。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2021-12-26
  • 2022-01-13
  • 2013-01-14
相关资源
最近更新 更多