Java协程编程之Loom项目尝鲜

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 + startprefix + (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源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

面试真题

Spring源码笔记

试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了

[外链图片转存中…(img-0cH1Z9lB-1714344178170)]

[外链图片转存中…(img-nub1UMDR-1714344178171)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值