【问题标题】:Manage at least three thread in JavaFx在 JavaFx 中管理至少三个线程
【发布时间】:2018-12-09 15:02:39
【问题描述】:

我正在尝试将我的服务器配置为管理至少 3 个客户端,但是当我这样做时,即使在连接第一个客户端之前,我也会收到内存不足错误。我该如何改进它?在ThreadedEchoHandler() 中,我接受了客户端的请求和包含服务器必须做的所有事情的运行方法。

public void initModel() throws IOException {
    contenutoTextArea.append("Waiting for connections\n");
    textarea.setText(contenutoTextArea.toString());
    s = new ServerSocket(5000);
    while (true) {
        Runnable r = new ThreadedEchoHandler();
        new Thread(r).start();
    }
}

编辑:ThreadedEchoHandler 的开始:

lass ThreadedEchoHandler implements Runnable {

    private Socket incoming;

    private String nomeAccount = "";

    public void run() {
        try {
            incoming = s.accept();
        } catch (IOException ex) {
            System.out.println("Unable to accept requests");
        }
    }

【问题讨论】:

  • 但是你在这里启动了无限数量的线程。
  • @Antoniossss 我用我接受请求的部分更新了问题。我应该把循环移到那里吗?
  • 您应该接受循环并在传入连接时启动线程,而不是相反。现在你正在一次启动无限线程。难怪你的资源用完了。

标签: java multithreading sockets javafx runnable


【解决方案1】:

您应该在发生while 循环的同一线程中执行accept,然后在接受新的连接后,启动一个新线程:

while (true) {
    Socket incoming = s.accept();
    Runnable r = new ThreadedEchoHandler(incoming);
    new Thread(r).start();
}

并修改ThreadEchoHandler 以从外部获取其Socket

class ThreadedEchoHandler implements Runnable {
    final private Socket incoming;
    private String nomeAccount = "";

    ThreadedEchoHandler(Socket incoming) {
        this.incoming = incoming;
    }

    public void run() {
        // do stuff
    }
}

当然你可以用各种方式组织它,比如ThreadedEchoHandler 可以从构造函数启动它的线程,甚至也可以执行accept,但同样,它必须发生在开始之前主题:

class ThreadedEchoHandler implements Runnable {
    final private Socket incoming;
    private String nomeAccount = "";

    ThreadedEchoHandler(ServerSocket serv) throws IOException {
        incoming = serv.accept();
        new Thread(this).start();
    }

    public void run() {
        // do stuff
    }
}

那么循环可能是这样的:

while (true) new ThreadedEchoHandler(s);

【讨论】:

  • 非常感谢,只有一个问题:服务器的GUI不加载(客户端工作)
  • 在 GUI 线程中有一个 while(true) 循环永远不会起作用,所以这个接受的东西应该放在它自己的线程中。然而,一个经验法则是,无论框架如何,GUI 事情总是首选在 GUI 线程中发生 - 请参阅 Platform.runLater() 了解 JavaFX 的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 1970-01-01
相关资源
最近更新 更多