- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试 Java 8 CompletableFutures。据我了解,调用 CompletableFuture.supplyAsync(Supplier seller, Executor executor) 总是会在传入的 Executor 提供的线程中运行作业,但我注意到,当我传递给供应商时,它有时会在主线程上运行这是相当“简单”的。我的测试代码是:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class SyncTest {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(5);
CompletableFuture<?>[] cfs = new CompletableFuture<?>[10];
AtomicInteger mainCount = new AtomicInteger();
for (int i = 0; i < cfs.length; i++) {
int index = i;
CompletableFuture<Integer> cf =
CompletableFuture.supplyAsync(() -> {
return index;
}, pool).thenApply(j -> {
if (Thread.currentThread().getName().equals("main")) {
mainCount.incrementAndGet();
}
System.out.println(Thread.currentThread().getName() + ": " + index + ": doing a heavy computation");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
return j;
});
cfs[i] = cf;
}
System.out.println(Thread.currentThread().getName() + " doing other stuff");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
CompletableFuture.allOf(cfs).join();
pool.shutdown();
System.out.println("Jobs on main: " + mainCount.get());
}
}
我得到的输出是这样的:
main: 0: doing a heavy computation
main: 1: doing a heavy computation
pool-1-thread-3: 2: doing a heavy computation
pool-1-thread-4: 3: doing a heavy computation
main: 4: doing a heavy computation
main doing other stuff
pool-1-thread-4: 9: doing a heavy computation
pool-1-thread-5: 8: doing a heavy computation
pool-1-thread-2: 7: doing a heavy computation
pool-1-thread-1: 6: doing a heavy computation
pool-1-thread-3: 5: doing a heavy computation
Jobs on main: 3
我知道这是一个相当简单的示例,并且 CompletableFutures 还有其他方法(例如 thenSupplyAsync 和completedFuture)可以使用它们,我更好奇其中一些任务如何可能在主线程上执行线程。
最佳答案
打印“doing a HeavyComputation”的任务是用thenApply
调用的,这意味着您没有指定执行器来运行该任务,系统可以自由使用任何执行器,包括当前线程。
如果您希望此作业在预定义执行器上执行,请改用 thenApplyAsync
,带或不带第二个参数 - 执行器。
关于java - CompletableFuture 供应异步有时在主线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50418870/
菜鸟问题。我正在尝试为我的 Vagrantfile 编写一个 shell 脚本,在服务器环境构建后加载数据库导出的自包含文件。目标是构建服务器,安装 mariadb,然后加载一个自包含的 sql 文件
这是我的 Vagrantfile 的一部分: config.vm.provision :shell, :privileged => false, :path => "bootstrap.sh"
我正在使用带有对 Elasticsearch 的响应式支持的 spring-data: @Repository public interface UserDocumentRepository exte
我想在Vagrant机器上运行docker镜像。 我的Vagrantfile很紧张: VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFI
尝试从旧版 Godeps 工作流迁移到官方支持的 Golang vendor 解决方案。 场景: Repo A=== \ ========> Repo C (s
我正在尝试使用 WHMCS API/配置模块在新的 WHM/cPanel 客户端完成托管订单后自动创建 mysql 数据库。 看起来应该很简单,但我在文档中找不到任何相关信息。 WHMCS 模块连接到
我正在努力让 Berkshelf 从我们的私有(private) BitBucket (git) 存储库中下载公司食谱。这是在 Windows 8.1 主机上。 我找到了this question并尝
我正在尝试在 Windows 8.1 上设置 Vagrant 进行 Web 开发。我已经遇到这个问题了undefined method “cheffish” for nil:NilClass ,所以我
我是一名优秀的程序员,十分优秀!