虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务。以下是虚拟线程的一些常见用法:
1. 使用Thread.startVirtualThread()创建虚拟线程
你可以直接创建一个虚拟线程并立即运行它:
Thread.startVirtualThread(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(10);
System.out.println("End virtual thread.");
});
这种方式会立即启动虚拟线程,并在其内部执行传入的Runnable任务。
2. 使用Thread.ofVirtual()创建虚拟线程
你可以创建一个未启动的虚拟线程,并手动调用start()方法来启动它:
Thread unStarted = Thread.ofVirtual().unstarted(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(1000);
System.out.println("End virtual thread.");
});
unStarted.start();
或者直接创建并启动一个虚拟线程:
Thread.ofVirtual().start(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(1000);
System.out.println("End virtual thread.");
});
这种方式允许你更灵活地控制虚拟线程的启动时机。
3. 使用ThreadFactory创建虚拟线程
通过ThreadFactory可以创建虚拟线程,并手动启动它们:
ThreadFactory factory = Thread.ofVirtual().factory();
Thread thread = factory.newThread(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(1000);
System.out.println("End virtual thread.");
});
thread.start();
这种方式适合于需要通过工厂模式创建和管理线程的场景。
4. 使用Executors.newVirtualThreadPerTaskExecutor()创建虚拟线程
你可以创建一个ExecutorService,为每个任务自动创建一个新的虚拟线程:
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10_000).forEach(i -> executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
System.out.println("task: " + i);
return i;
}));
}
这种方式适合于需要大量并发执行任务的场景,每个任务都会在一个新的虚拟线程中执行。
5. 结构化并发
虚拟线程还支持结构化并发,允许你以更安全的方式管理多个并发任务:
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
StructuredTaskScope.Subtask<String> fork1 = scope.fork(VirtualThreadTests::task1);
StructuredTaskScope.Subtask<String> fork2 = scope.fork(VirtualThreadTests::task2);
StructuredTaskScope.Subtask<String> fork3 = scope.fork(VirtualThreadTests::task3);
scope.join();
System.out.println(fork1);
System.out.println(fork2);
System.out.println(fork3);
}
这种方式可以在子任务发生错误时,自动取消其他未完成的子任务。
以上是虚拟线程的一些基本用法,它们可以帮助你更有效地处理高并发的I/O密集型任务。
2018

被折叠的 条评论
为什么被折叠?



