Java 在不冻结线程的情况下Ping服务器
我尝试使用多个线程,可惜没有运气:Java 在不冻结线程的情况下Ping服务器,java,multithreading,sockets,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 {
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服务器?您需要从代码中删除以下行。 join()将强制主线程等待tt完成
try {
tt.join();
} catch (InterruptedException e) {
tt.stop();
}
tt.stop();
改用Future获得结果供以后使用你到底想得到什么
try {
tt.join();
} catch (InterruptedException e) {
tt.stop();
}
街区?
在这里,您加入到并行线程并等待该线程结束(得到ping结果)
您有下一个选择:
- 等到ping结束
- 不要等待。。。而且没有结果
- 使用一些并发类,如Future来获得结果(但若还并没有检索到结果,那个么在询问结果时,您将阻塞线程)
- 或者您可以使用一些“回调”函数/接口从内部“ping”线程抛出结果
tt
完成其执行。@Reimeus用户告诉我tt.join()误导了我;等待任务完成。如果你只是等待它完成,为什么要启动一个线程来做某事?与其等待,不如自己动手。这条线对你有什么好处?