我正在学习Java8以及更多关于“可完成的未来”的细节。以下是有趣的教程:https://www.callicoder.com/java-8-completablefuture-tutorial/
我编写了以下Java类:
package parallels;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
public class Test {
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0";
private static final Executor executor = Executors.newFixedThreadPool(100);
public static void main(String[] args) {
List<String> webPageLinks= new ArrayList<String>();
for (int i=0;i<30;i++) {
webPageLinks.add("http://jsonplaceholder.typicode.com/todos/1");
}
// Download contents of all the web pages asynchronously
List<CompletableFuture<String>> pageContentFutures = webPageLinks.stream()
.map(webPageLink -> downloadWebPage(webPageLink))
.collect(Collectors.toList());
// Create a combined Future using allOf()
CompletableFuture<Void> allFutures = CompletableFuture.allOf(
pageContentFutures.toArray(new CompletableFuture[pageContentFutures.size()])
);
// When all the Futures are completed, call `future.join()` to get their results and collect the results in a list -
CompletableFuture<List<String>> allPageContentsFuture = allFutures.thenApply(v -> {
return pageContentFutures.stream()
.map(pageContentFuture -> pageContentFuture.join())
.collect(Collectors.toList());
});
}
private static CompletableFuture<String> downloadWebPage(String pageLink) {
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> getRequest(pageLink),executor);
return completableFuture;
}
public static String getRequest(String url) {
System.out.println("getRequest");
String resp =null;
try {
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(url);
target.register((ClientRequestFilter) requestContext -> {
requestContext.getHeaders().add("User-Agent",USER_AGENT);
});
Response response = target.request().get();
resp= response.readEntity(String.class);
System.out.println(resp);
response.close();
client.close();
System.out.println("End getRequest");
}catch(Throwable t) {
t.printStackTrace();
}
return resp;
}
}
(为了运行该代码,您需要resteasy-Client库)
但是我不明白为什么即使收集了所有的响应,主方法也不会终止...
我错过什么了吗?是否有一些“完整”的方法可以在任何地方调用,如果是,在哪里调用?
主方法完成,但程序继续运行,因为您已经创建了其他仍处于活动状态的线程。最好的解决方案是在您将所有任务提交给ExecutorService后调用shutdown。
或者,您可以创建一个使用守护进程
线程的ExecutorService(请参阅线程文档),或者创建一个具有allowCoreThreadTimeout(true)的ThreadPoolExecutor,或者只调用System。在主方法的末尾退出。
这是我正在研究的完全未来的例子 首先我从SupplySync调用compose方法,在这里我执行方法composeMethod,有三毫秒的延迟,然后它将创建一个文件并返回一个字符串作为结果。完成后,我调用Run方法,它只打印一个方法,然后有一个非阻塞方法从主线程运行。 我在这里面临的问题是,主线程执行完nonblockingmethod()并在3毫秒延迟之前退出进程,而随后的composeMeth
我还尝试使用而不是提取ZIP归档,但随后出现以下错误: ZIP文件没有问题,我已经在Mac OSX上用测试了它。我还尝试使用ZIP版本3.0和2.1(最初是2.0)重新压缩它。我可以在Mac OSx上解压所有版本而没有任何问题(使用Unarchiver和Archive实用程序)。 这快把我逼疯了,可能会有什么错? 我在解压压缩文件之前从服务器下载这些压缩文件,显然我忘记在开始解压操作之前调用下载操
我正在为一个简单的Spring Boot应用程序编写Kafka联调。该应用程序简单地发布到Kafka主题。 我正在使用一个嵌入式Kafka实例进行测试。当通过Intellij运行时,测试运行得非常好,但当我通过gradle运行时,测试失败。看起来好像倒计时从未达到0,测试最终超时。 生产者配置: 制片人: 消费者: 测试: application.yml: 知道问题出在哪里吗?
问题内容: 几天前,我意识到PrintWriter(以及PrintStream)在写入,刷新或关闭时 从不会抛出IOException 。 而是在发生错误时设置内部标志()。 不可能获得确切的异常,只有 在 存在某些异常(checkError())的情况下。 我的问题是:为什么一个人要发生这种行为?API设计不是很糟糕吗? 问题答案: 我认为由于是和的实例,因此提供了一些更轻松的错误处理。就像其他
问题内容: 我正在开发游戏,但扫描仪遇到了一个小问题。我收到了一个从未关闭过的资源泄漏扫描程序。 但是我认为我的扫描仪在没有关闭之前就可以正常工作。但是现在不是。有人可以帮我吗? 问题答案: 我假设您正在使用Java 7,因此会收到编译器警告,当您不关闭资源时,通常应在finally块中关闭扫描程序。 甚至更好:使用新的 Try with resource语句 :
问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。