在不冻结线程的情况下ping服务器

时间:2015-06-09 13:38:55

标签: java multithreading sockets

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

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服务器的方法?

2 个答案:

答案 0 :(得分:3)

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

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

使用Future代替获取结果供以后使用

答案 1 :(得分:3)

你到底想要什么?

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

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

您有下一个选择:

  • 等到ping结束
  • 不要等待......并且没有结果
  • 使用一些并发类,例如Future<>得到结果(但如果没有检索到,你会在询问结果时阻止线程)
  • 或者您可以使用一些'回调'函数/接口从内部'ping'线程中抛出结果。