java - Java运行与主线程并行的任务而不阻塞它
问题描述
我正在尝试使用 Java 8 的 CompletableFuture 功能,该功能说它提供了异步运行的能力。但是为了执行“未来”需要调用future.get()
方法。这样做会阻塞主线程。因为它在执行之后的行之前等待 30 秒睡眠future.get()
有没有办法做到这一点?执行我尝试打印的非阻塞方式
“我会在主线程中运行。”
前
“我将在与主线程不同的线程中运行。”
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
// Simulate a long-running Job
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
System.out.println("I'll run in a separate thread than the main thread.");
}
});
future.get();
System.out.println("I'll run in the main thread.");
}
解决方案
CompletableFuture.runAsync(Runnable)
已经开始运行您的其他线程。调用future.get()
只是等待该线程完成运行并获得其结果的一种方式,然后再继续执行调用的线程。
当您get
立即启动线程并且它之间没有做任何事情(如您所做的那样)时,那么运行线程就没有意义了。
推荐阅读
- javascript - React 中的 Eslint 更漂亮的误报 - serviceWorker.ts
- javascript - Why props is not working with my child component React JS (react native)
- python-3.x - i cant access to post data in get from django
- reactjs - Chrome Extension using React limited to popover
- python - Lines are not highlighted
- java - Painting a Rectangle to a Canvas via Button
- jquery - 在 Bootstrap 中清除数据关闭的所有模态弹出数据
- spring-boot - 用于 SCDF Kubernetes 的 Cloudfoundry-UAA
- c# - 在 Visual Studio 快速操作中优先使用用户命名空间而不是系统
- docker - 如何使用 docker 驱动程序访问 Minikube 中的 NodePort?