正文
从 Java 代码的角度来看,虚拟线程感觉就像普通线程,但它们没有 1:1 映射到操作系统/平台线程。它是从虚拟线程到载体线程进而到操作系统线程的M:N映射。
有一个所谓的载体线程池,虚拟线程临时映射(“安装”)到该线程池上。一旦虚拟线程遇到阻塞操作,虚拟线程就会从载体线程中移除(“卸载”),并且载体线程可以执行另一个虚拟线程(新的或之前被阻塞的虚拟线程)。
虚拟线程的一些优点:
要创建虚拟线程,我们可以使用
Thread.ofVirtual()
工厂方法并传递可运行对象。
-
Thread.ofVirtual().start(Runnable);
-
Thread.ofVirtual().unstarted(Runnable);
如果你想让虚拟线程立即启动,你可以使用
start()
方法,它会立即执行传递给它的
Runnable start()
。
如果不希望虚拟线程立即启动,可以使用该
unstarted()
方法。
我们只需要替换
newFixedThreadPool
为
newVirtualThreadPerTaskExecutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class VirtualThreadExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(() -> {
System.out.println(Thread.currentThread().getName())
});
executor.shutdown();
}
}
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
顺序集合为我们提供了defined encounter order(是一种所见即所得的顺序,含义是从队列中取出元素的顺序既是你存放该元素时候的顺序),用于访问第一个和最后一个元素并以相反的顺序迭代。
这意味着我们可以在集合的两端添加、检索或删除元素。
public interface SequencedCollection<E> extends Collection<E> {
default void addFirst(E e) { ... }
default void addLast(E e) { ... }
default E getFirst() { ... }
default E getLast() { ... }
default E removeFirst() { ... }
default E removeLast() { ... }
SequencedCollection reversed();
}
正如我们所看到的,除了
reverse()
之外的所有方法都是默认方法并提供默认实现。
这意味着现有的集合类(例如 ArrayList 和 LinkedList)都可以实现此接口,而无需更改其代码。
ArrayList list = new ArrayList<>();
list.add(1); // [1]
list.addFirst(0); // [0, 1]
list.addLast(2); // [0, 1, 2]
list.getFirst(); // 0
list.getLast(); // 2
list.reversed(); // [2, 1, 0]