【问题标题】:Ping a server without freezing the Thread在不冻结线程的情况下 Ping 服务器
【发布时间】:2015-06-09 13:38:54
【问题描述】:

我尝试使用多个线程,遗憾的是没有运气:

public synchronized boolean pingServer(final String ip, final short port) {
    final boolean[] returnbol = new boolean[1];
    Thread tt = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Socket s = new Socket(ip, port);
                s.close();
                returnbol[0] = true;
            } catch (IOException e) {
                returnbol[0] = false;
            }
        }
    });
    tt.start();
    try {
        tt.join();
    } catch (InterruptedException e) {
        tt.stop();
    }
    tt.stop();
    return returnbol[0];
}

由于某种原因,主线程仍然冻结。

是否有“无延迟”的方式来 ping 服务器?

【问题讨论】:

  • 你认为tt.join() 是做什么的?
  • 您正在让当前线程等待tt 完成执行。
  • @Reimeus 我被用户误导了 tt.join();等任务完成。
  • 如果你只是要等待它完成,为什么要启动一个线程来做某事?与其等待,不如自己动手。线程给你带来了什么?

标签: java multithreading sockets


【解决方案1】:

你到底想要什么

try {
        tt.join();
    } catch (InterruptedException e) {
        tt.stop();
    }

阻止? 在这里,您加入了并行线程并等待该线程结束(得到 ping 结果)。

你有下一个选择:

  • 等到 ping 结束
  • 不要等待......而且没有结果
  • 使用一些并发类,如 Future 来获取结果(但如果尚未检索到结果,您将在询问结果时阻塞线程)
  • 或者您可以使用一些“回调”函数/接口从内部“ping”线程中抛出结果。

【讨论】:

    【解决方案2】:

    您需要从代码中删除以下行。 tt.join() 将强制主线程等待 tt 完成。

    try {
        tt.join();
    } catch (InterruptedException e) {
        tt.stop();
    }
    tt.stop();
    

    使用 Future 来获取结果以供以后使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2010-12-11
      • 2020-02-09
      相关资源
      最近更新 更多