JDK19中的大杀器:虚拟线程,到底是什么?
JDK19中的虚拟线程就是业界的协程。
因为协程是用户态的,线程是操作系统内核态的,所以协程仍然基于的是线程,一个线程可以承载多个协程,但如果所有协程都只基于一个线程,那样效率肯定会不高,所以JDK19中协程会基于ForkJoinPool线程池,利用多个线程来支持协程的运行,并且利用ForkJoinPool,而不是普通的ThreadPoolExecutor,可以支持大任务的拆分。
JDK19中的协程底层是基于ForkJoinPool的,相当于,我们在利用协程执行Runnable时,底层会把Runnable提交到一个ForkJoinPool中去执行,我们可以通过:
- -Djdk.virtualThreadScheduler.parallelism=1
- -Djdk.virtualThreadScheduler.maxPoolSize=1
这两个参数来设置ForkJoinPool的核心线程数和最大线程数:
- parallelism默认为Runtime.getRuntime().availableProcessors()
- maxPoolSize默认为256
ForkJoinPool中的线程在执行任务过程中,一旦线程阻塞了,比如sleep、lock、io操作时,那么这个线程就会去执行ForkJoinPool中的其他任务,从而可以做到一个线程在执行过程中,也能并发的执行多个任务,达到协程并发执行任务的效果。