在 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: .