Java 多线程测试
for (int i = 0; i < 1000000; i++) {
new Thread(() -> {
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
当线程达到一定数量的时候会出现
携程例子
添加依赖
<dependency> <groupId>co.paralleluniverse</groupId> <artifactId>quasar-core</artifactId> <version>0.7.9</version> <classifier>jdk8</classifier> </dependency>
public static void main(String[] args) throws Exception {
//使用阻塞队列来获取结果。
LinkedBlockingQueue<Fiber<Integer>> fiberQueue = new LinkedBlockingQueue<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < 1000000; i++) {
int finalI = i;
//这里的Fiber有点像Callable,可以返回数据
Fiber<Integer> fiber = new Fiber<>((SuspendableCallable<Integer>) () -> {
//这里用于测试内存占用量
Fiber.sleep(100000);
System.out.println("in-" + finalI + "-" + LocalDateTime.now().format(formatter));
return finalI;
});
//开始执行
fiber.start();
//加入队列
fiberQueue.add(fiber);
}
while (true) {
//阻塞
Fiber<Integer> fiber = fiberQueue.take();
System.out.println("out-" + fiber.get() + "-" + LocalDateTime.now().format(formatter));
}
}
阻塞之后可以返回数据,并且执行完1000000。
协程的方式更多用来做I/O密集型的操作。
计算密集型的还是使用线程更加合理。
输出结果
in-3-2021-02-05 14:31:36
in-6-2021-02-05 14:31:36
in-5-2021-02-05 14:31:36
in-2-2021-02-05 14:31:36
in-4-2021-02-05 14:31:36
in-1-2021-02-05 14:31:36
in-7-2021-02-05 14:31:36
in-8-2021-02-05 14:31:36
in-0-2021-02-05 14:31:36
in-9-2021-02-05 14:31:36
out-0-2021-02-05 14:31:36
out-1-2021-02-05 14:31:36
out-2-2021-02-05 14:31:36
out-3-2021-02-05 14:31:36
out-4-2021-02-05 14:31:36
out-5-2021-02-05 14:31:36
out-6-2021-02-05 14:31:36
out-7-2021-02-05 14:31:36
out-8-2021-02-05 14:31:36
out-9-2021-02-05 14:31:36for 循环修改 为10