盼过了春天盼秋天,从2017年到今天五年了,终于盼到loom转正了,当看到jdk19预览api的时候心情那个激动。。。期待已久的协程终于来临,再也不羡慕别人家的go孩子,咱终于可以理直气壮的说一句:咱也有,怕啥?

之前研究并发着实羡慕了一把go的线程,因为本身是游戏开发出身,使用的reactor模式也不吃协程的红利,疯狂压榨机器性能才是追求的目标,这点上线程密集的顺序调度性能是协程比不上的,因为协程在管理和调度上的开销,导致性能损耗,游戏其实也更适合CPU密集型计算,但是问题是游戏也不是一座孤岛,还有网关服,账号服,充值服,gm管理服,http服(游戏附带的一些数据请求)等的存在,举个例子:一个登陆请求来了,先去账号获取登陆信息,账号又得去平台中心的账号验证,期间还得去一趟网关服拉取服务器信息,验证完整后还得去redis刷新一波,这一套操作下来,线程等待的开销着实吃不消,能提供的并发访问数也很有限,这个时候突然想起了隔壁go的协程,真的是各种羡慕嫉妒恨,用协程写起来不用考虑性能问题真是的想咋写咋写,我单手写,倒立写,跳起来写。。。可惜我大java没有。。。只能靠着保存堆栈的上下文信息避开死亡回调,写起来也是束手束脚,远没有go同步写法来的过瘾。整日郁郁寡欢的我突然刷到JDK19的到来并带来了重磅级发布:虚拟线程。这下,是真的舒服了。。。
破母鸡带的想要尝试一把,先来个启动:
/**** @desc 主线程*******************************************/public static void main(String[] args){System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");for (int i : calcNum)testThread(i);for (GarbageCollectorMXBean gc : ManagementFactory.getGarbageCollectorMXBeans()) {long count = gc.getCollectionCount();long time = gc.getCollectionTime();String name = gc.getName();System.out.println(String.format("%s: %s times %s ms", name, count, time));}}private static void testThread(int count){AtomicInteger i = new AtomicInteger(count);Thread mainThread = Thread.currentThread();startDate.set(System.currentTimeMillis());for(int j = 0; j< count; j++) {Thread.startVirtualThread(()->{try {Thread.sleep(100l);} catch (InterruptedException e) {throw new RuntimeException(e);}if(i.getAndDecrement() == 1) {System.out.println("threadNum:"+ count+",perDate:" + (System.currentTimeMillis() - startDate.get())+" ms");LockSupport.unpark(mainThread);}});}LockSupport.park();}
执行的时候得加上:–source 19 --enable-preview
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
threadNum:1000,perDate:131 ms
threadNum:10000,perDate:151 ms
threadNum:50000,perDate:173 ms
threadNum:100000,perDate:229 ms
threadNum:200000,perDate:405 ms
threadNum:500000,perDate:1458 ms
threadNum:1000000,perDate:2241 ms
G1 Young Generation: 0 times 0 ms
G1 Old Generation: 0 times 0 ms
100W线程一顿操作,心里那叫一个舒坦,用线程的情况下1000个就开始叫苦不迭,现在轻轻松松百万级,也不用再走线程的内核态进行线程切换,终于可以扬眉吐气了,抬头挺胸把人做。现在开始就静静的等待预览API快些转到常规API。。。后续会放出java和go的协程对比。今天先到这里了,下章见。















