虚拟线程简单用法

以下包含AI创作

  • ExecutorService用法
 try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
        var future1 = executor.submit(() -> fetchURL(url1));
        var future2 = executor.submit(() -> fetchURL(url2));
        response.send(future1.get() + future2.get());
    } catch (ExecutionException | InterruptedException e) {
        response.fail(e);
    }
  • 创建虚拟线程:可以通过Thread.Builder API来指定创建虚拟线程,以及其他一些选项。例如:
// create a virtual thread
Thread thread = Thread.ofVirtual().name("my-virtual-thread").start(() -> {
    // do some work
});
  • 等待虚拟线程完成:可以通过CompletableFuture或其他异步机制来等待虚拟线程完成,而不是调用Thread.join()方法,因为它会阻塞本地线程。例如:
// create a virtual thread and return a CompletableFuture
CompletableFuture<Void> future = Thread.ofVirtual().name("my-virtual-thread").startAsync(() -> {
    // do some work
});

// wait for the virtual thread to complete
future.join();
  • 取消或停止虚拟线程:可以通过其他方式来取消或停止虚拟线程,而不是调用Thread.interrupt()方法,因为它会导致不可预测的行为。例如:
// create a virtual thread and return a CompletableFuture
CompletableFuture<Void> future = Thread.ofVirtual().name("my-virtual-thread").startAsync(() -> {
    // do some work
});

// cancel the virtual thread
future.cancel(true);
  • 使用定时器或延迟执行:可以使用ScheduledExecutorService或其他定时器来实现延迟执行,而不是调用Thread.sleep(long)方法,因为它会阻塞本地线程。例如:
// create a ScheduledExecutorService
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

// create a virtual thread and schedule it to run after 5 seconds
scheduler.schedule(Thread.ofVirtual().name("my-virtual-thread").task(() -> {
    // do some work
}), 5, TimeUnit.SECONDS);
  • 使用Thread-local变量:可以使用java.lang.ThreadLocal类来创建和管理线程局部变量,与本地线程没有区别。不过,需要注意的是,虚拟线程之间的数据可能不一致,因为每个虚拟线程只能看到自己的变量副本,而不能看到其他虚拟线程的变量副本。例如:
// 创建一个ThreadLocal对象
private ThreadLocal<String> threadLocal = new ThreadLocal<String> ();

// 在虚拟线程中设置和获取线程局部变量的值
Thread thread = Thread.ofVirtual().name("my-virtual-thread").start(() -> {
    // 设置线程局部变量的值
    threadLocal.set("Hello, virtual thread!");
    // 获取线程局部变量的值
    String value = threadLocal.get();
    // 打印线程局部变量的值
    System.out.println(value);
});
posted @ 2023-08-16 15:02  大哥超帅  阅读(97)  评论(0编辑  收藏  举报