在 Java Lambda 布尔方法中获取 false
Getting false in Java Lambda boolean Method
您好,我有一个检查代理的代码。当我 运行 方法时,我总是得到 false。我的理解是最后一个false的问题。当我使用 println 在控制台上输出它时,它在 false 和 true 之间也有所不同,但 return 不是方法的 return 值的正确值。你能帮忙吗?如果代理在线,代码必须输出true
final ExecutorService es = Executors.newFixedThreadPool(100);
public boolean isProxyOnline(String proxyIp, int proxyPort) {
es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
return false;
}
您必须 return es.submit
的结果,即 Future<Boolean>
,或者您必须通过调用 [=13= 等待 Future
的结果] 在上面,这会阻塞。
但是第一种方式,这种方式不需要提交任务到线程池:
public boolean isProxyOnline(String proxyIp, int proxyPort) throws ExecutionException, InterruptedException {
Future<Boolean> submit = es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
// block until the task you submitted to the thread pool completes execution and return a result(true or false).
return submit.get();
}
第二种方式,在这种方式下,该方法会立即return一个Future
,然后您需要再次调用future#get
,这是块得到结果。
public Future<Boolean> isProxyOnlineWithFuture(String proxyIp, int proxyPort) {
return es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
}
isProxyOnline
方法的return值与你提交给线程池的任务的return值无关。当您向线程池提交任务时,您会得到一个 Future,它反映了您的任务执行结果。
你也可以考虑使用 CompletableFuture 或 ListenableFuture: .
您好,我有一个检查代理的代码。当我 运行 方法时,我总是得到 false。我的理解是最后一个false的问题。当我使用 println 在控制台上输出它时,它在 false 和 true 之间也有所不同,但 return 不是方法的 return 值的正确值。你能帮忙吗?如果代理在线,代码必须输出true
final ExecutorService es = Executors.newFixedThreadPool(100);
public boolean isProxyOnline(String proxyIp, int proxyPort) {
es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
return false;
}
您必须 return es.submit
的结果,即 Future<Boolean>
,或者您必须通过调用 [=13= 等待 Future
的结果] 在上面,这会阻塞。
但是第一种方式,这种方式不需要提交任务到线程池:
public boolean isProxyOnline(String proxyIp, int proxyPort) throws ExecutionException, InterruptedException {
Future<Boolean> submit = es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
// block until the task you submitted to the thread pool completes execution and return a result(true or false).
return submit.get();
}
第二种方式,在这种方式下,该方法会立即return一个Future
,然后您需要再次调用future#get
,这是块得到结果。
public Future<Boolean> isProxyOnlineWithFuture(String proxyIp, int proxyPort) {
return es.submit(() -> {
try {
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyIp, proxyPort));
URLConnection connection = new URL("http://www.google.com").openConnection(proxy);
connection.setConnectTimeout(1000);
connection.connect();
System.out.println("true");
return true;
} catch (Exception e) {
System.out.println("false");
return false;
}
});
}
isProxyOnline
方法的return值与你提交给线程池的任务的return值无关。当您向线程池提交任务时,您会得到一个 Future,它反映了您的任务执行结果。
你也可以考虑使用 CompletableFuture 或 ListenableFuture: