ofPlatform()
方法用于构建Thread
实例,这里的 Platform Thread (平台线程)
其实就是 JDK1.0
引入的线程实例,普通的用户线程
ofVirtual()
方法用于构建 VirtualThread
实例,也就是构建协程实例
这两个建造器实例的所有 Setter
方法链展开如下:
public static void main(String[] args) {
Thread.Builder.OfPlatform platformThreadBuilder = Thread.ofPlatform()
// 是否守护线程
.daemon(true)
// 线程组
.group(Thread.currentThread().getThreadGroup())
// 线程名称
.name(“thread-1”)
// 线程名称前缀 + 起始自增数字 => prefix + start,下一个创建的线程名称就是prefix + (start + 1)
// start > 0的情况下会覆盖name属性配置
.name(“thread-”, 1L)
// 是否启用ThreadLocal
.allowSetThreadLocals(false)
// 是否启用InheritableThreadLocal
.inheritInheritableThreadLocals(false)
// 设置优先级
.priority(100)
// 设置线程栈深度
.stackSize(10)
// 设置未捕获异常处理器
.uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
}
});
// thread-1
Thread firstThread = platformThreadBuilder.unstarted(() -> System.out.println(“Hello Platform Thread First”));
// thread-2
Thread secondThread = platformThreadBuilder.unstarted(() -> System.out.println(“Hello Platform Thread Second”));
Thread.Builder.OfVirtual virtualThreadBuilder = Thread.ofVirtual()
// 协程名称
.name(“fiber-1”)
// 协程名称前缀 + 起始自增数字 => prefix + start,下一个创建的协程名称就是prefix + (start + 1)
// start > 0的情况下会覆盖name属性配置
.name(“fiber-”, 1L)
// 是否启用ThreadLocal
.allowSetThreadLocals(false)
// 是否启用InheritableThreadLocal
.inheritInheritableThreadLocals(false)
// 设置调度器,Executor实例,也就是调度器是一个线程池,设置为NULL会使用VirtualThread.DEFAULT_SCHEDULER
.scheduler(null)
// 设置未捕获异常处理器
.uncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
}
});
// fiber-1
Thread firstFiber = virtualThreadBuilder.unstarted(() -> System.out.println(“Hello Platform Virtual First”));
// fiber-2
Thread secondFiber = virtualThreadBuilder.unstarted(() -> System.out.println(“Hello Platform Virtual Second”));
}
这里可以发现一点,就是 建造器是可以复用的 。如果想用建造器创建同一批参数设置相同的线程或者协程,可以设置 name(String prefix, long start)
方法,定义线程或者协程的名称前缀和一个大于等于 0 的数字,反复调用 Builder#unstarted(Runnable task)
方法就能批量创建线程或者协程,名称就设置为 prefix + start
、 prefix + (start + 1)
、 prefix + (start + 2)
以此类推。协程创建基本就是这么简单,运行的话直接调用 start()
方法:
public class FiberSample2 {
public static void main(String[] args) throws Exception {
Thread.ofVirtual()
.name(“fiber-1”)
.allowSetThreadLocals(false)
.inheritInheritableThreadLocals(false)
.unstarted(() -> {
Thread fiber = Thread.currentThread();
System.out.printf(“[%s,daemon:%s,virtual:%s] - Hello World\n”, fiber.getName(),
fiber.isDaemon(), fiber.isVirtual());
}).start();
// 主线程休眠
Thread.sleep(Long.MAX_VALUE);
}
}
目前无法在主流 IDE 编译上面的类,所以只能使用该 JDK 目录下的工具编译和运行,具体如下:
执行 - 当前目录I:\J-Projects\framework-source-code\fiber-sample\src\main\java
(1)编译:I:\Environment\Java\jdk-18-loom\bin\javac.exe I:\J-Projects\framework-source-code\fiber-sample\src\main\java\cn\throwx\fiber\sample\FiberSample2.java
(2)执行main方法:I:\Environment\Java\jdk-18-loom\bin\java.exe cn.throwx.fiber.sample.FiberSample2
这里也看出了一点,所有的协程实例的daemon
标识默认为 true
且不能修改。
##小结
如果用尝鲜的角度去使用 Loom
项目,可以提前窥探 JVM
开发者们是如何基于协程这个重大特性进行开发的,这对于提高学习 JDK
内核代码的兴趣有不少帮助。从目前来看,对于协程的实现Loom
项目距离 RELEASE
版本估计还有不少功能需要完善,包括新增 API
的稳定性,以及协程是否能够移植到原有的 JUC
类库中使用(当前的 Loom-JDK-18+9
没有对原来的线程池等类库进行修改)等问题需要解决,所以在保持关注的过程中静心等待吧。
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了
试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了
[外链图片转存中…(img-0cH1Z9lB-1714344178170)]
[外链图片转存中…(img-nub1UMDR-1714344178171)]