From 6f03f38222bc16369b8a40ac30cc4f09fda5c669 Mon Sep 17 00:00:00 2001 From: redkale Date: Thu, 30 Mar 2023 23:05:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0AnonymousVirtualExecutor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/redkale/boot/Application.java | 4 +-- src/main/java/org/redkale/net/WorkThread.java | 8 ++++- .../redkale/source/AbstractDataSource.java | 2 +- .../util/AnonymousVirtualExecutor.java | 27 ++++++++++++++++ src/main/java/org/redkale/util/Utility.java | 31 +++++++++++++++++++ 5 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/redkale/util/AnonymousVirtualExecutor.java diff --git a/src/main/java/org/redkale/boot/Application.java b/src/main/java/org/redkale/boot/Application.java index 2d40ce8f4..a2155a4a0 100644 --- a/src/main/java/org/redkale/boot/Application.java +++ b/src/main/java/org/redkale/boot/Application.java @@ -565,7 +565,7 @@ public final class Application { if (workHash) { workExecutor0 = WorkThread.createHashExecutor(workThreads, "Redkale-HashWorkThread-%s"); } else { - workExecutor0 = WorkThread.createExecutor(workThreads, "Redkale-WorkThread-%s"); + workExecutor0 = WorkThread.createWorkExecutor(workThreads, "Redkale-WorkThread-%s"); } } this.workExecutor = workExecutor0; @@ -575,7 +575,7 @@ public final class Application { ExecutorService clientExecutor = workExecutor0; if (clientExecutor == null) { //给所有client给一个默认的ExecutorService - clientExecutor = WorkThread.createExecutor(executorConf.getIntValue("clients", Utility.cpus()), "Redkale-DefaultClient-WorkThread-%s"); + clientExecutor = WorkThread.createWorkExecutor(executorConf.getIntValue("clients", Utility.cpus()), "Redkale-DefaultClient-WorkThread-%s"); } this.clientAsyncGroup = new AsyncIOGroup("Redkale-DefaultClient-IOThread-%s", clientExecutor, bufferCapacity, bufferPoolSize).skipClose(true); } diff --git a/src/main/java/org/redkale/net/WorkThread.java b/src/main/java/org/redkale/net/WorkThread.java index b08203022..fd166b058 100644 --- a/src/main/java/org/redkale/net/WorkThread.java +++ b/src/main/java/org/redkale/net/WorkThread.java @@ -8,7 +8,8 @@ package org.redkale.net; import java.util.Collection; import java.util.concurrent.*; import java.util.concurrent.atomic.*; -import org.redkale.util.ThreadHashExecutor; +import java.util.function.Function; +import org.redkale.util.*; /** * 协议处理的自定义线程类 @@ -58,6 +59,11 @@ public class WorkThread extends Thread implements Executor { }); } + public static ExecutorService createWorkExecutor(final int threads, final String threadNameFormat) { + final Function func = Utility.virtualExecutorFunction(); + return func == null ? createExecutor(threads, threadNameFormat) : func.apply(threadNameFormat); + } + public static ExecutorService createExecutor(final int threads, final String threadNameFormat) { final AtomicReference ref = new AtomicReference<>(); final AtomicInteger counter = new AtomicInteger(); diff --git a/src/main/java/org/redkale/source/AbstractDataSource.java b/src/main/java/org/redkale/source/AbstractDataSource.java index d868dc537..bffe3b07e 100644 --- a/src/main/java/org/redkale/source/AbstractDataSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSource.java @@ -291,7 +291,7 @@ public abstract class AbstractDataSource extends AbstractService implements Data executorLock.lock(); try { if (this.sourceExecutor == null) { - this.sourceExecutor = WorkThread.createExecutor(sourceThreads, "Redkale-DataSource-WorkThread-" + resourceName() + "-%s"); + this.sourceExecutor = WorkThread.createWorkExecutor(sourceThreads, "Redkale-DataSource-WorkThread-" + resourceName() + "-%s"); } } finally { executorLock.unlock(); diff --git a/src/main/java/org/redkale/util/AnonymousVirtualExecutor.java b/src/main/java/org/redkale/util/AnonymousVirtualExecutor.java new file mode 100644 index 000000000..dcd930e04 --- /dev/null +++ b/src/main/java/org/redkale/util/AnonymousVirtualExecutor.java @@ -0,0 +1,27 @@ +///* +// * +// */ +//package org.redkale.util; +// +//import java.util.concurrent.*; +//import java.util.concurrent.atomic.AtomicInteger; +//import java.util.function.Function; +// +///** +// * +// * @author zhangjx +// */ +//public class AnonymousVirtualExecutor implements Function { +// +// @Override +// public ExecutorService apply(String threadNameFormat) { +// final ThreadFactory factory = Thread.ofVirtual().factory(); +// final AtomicInteger counter = new AtomicInteger(); +// return Executors.newThreadPerTaskExecutor(r -> { +// Thread t = factory.newThread(r); +// int c = counter.incrementAndGet(); +// t.setName(String.format(threadNameFormat, "Virtual-" + (c < 10 ? ("00" + c) : (c < 100 ? ("0" + c) : c)))); +// return t; +// }); +// } +//} diff --git a/src/main/java/org/redkale/util/Utility.java b/src/main/java/org/redkale/util/Utility.java index 3de05637d..cf67cb8b2 100644 --- a/src/main/java/org/redkale/util/Utility.java +++ b/src/main/java/org/redkale/util/Utility.java @@ -63,6 +63,10 @@ public final class Utility { JAVA_RECORD_CLASS = clz; } + private static final String functionVirtualExecutorBinary = "cafebabeffff003f008d0a000200030700040c000500060100106a6176612f6c616e672f4f626a6563740100063c696e69743e0100032829560a0008000907000a0c000b000c0100106a6176612f6c616e672f5468726561640100096f665669727475616c01002628294c6a6176612f6c616e672f546872656164244275696c646572244f665669727475616c3b0b000e000f0700100c001100120100226a6176612f6c616e672f546872656164244275696c646572244f665669727475616c010007666163746f727901002628294c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b0700140100296a6176612f7574696c2f636f6e63757272656e742f61746f6d69632f41746f6d6963496e74656765720a0013000312000000170c001800190100096e6577546872656164010087284c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b4c6a6176612f7574696c2f636f6e63757272656e742f61746f6d69632f41746f6d6963496e74656765723b4c6a6176612f6c616e672f537472696e673b294c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b0a001b001c07001d0c001e001f01001e6a6176612f7574696c2f636f6e63757272656e742f4578656375746f72730100186e65775468726561645065725461736b4578656375746f7201004c284c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b294c6a6176612f7574696c2f636f6e63757272656e742f4578656375746f72536572766963653b0700210100106a6176612f6c616e672f537472696e670a002300240700250c002600270100296f72672f7265646b616c652f7574696c2f416e6f6e796d6f75735669727475616c4578656375746f720100056170706c7901003a284c6a6176612f6c616e672f537472696e673b294c6a6176612f7574696c2f636f6e63757272656e742f4578656375746f72536572766963653b0b0029002a07002b0c0018002c0100226a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f7279010028284c6a6176612f6c616e672f52756e6e61626c653b294c6a6176612f6c616e672f5468726561643b0a0013002e0c002f003001000f696e6372656d656e74416e6447657401000328294912000100320c003300340100176d616b65436f6e63617457697468436f6e7374616e74730100152849294c6a6176612f6c616e672f537472696e673b12000200320a003700380700390c003a003b0100116a6176612f6c616e672f496e746567657201000776616c75654f660100162849294c6a6176612f6c616e672f496e74656765723b0a0020003d0c003a003e010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b12000300400c00330041010026284c6a6176612f6c616e672f537472696e673b294c6a6176612f6c616e672f537472696e673b0a002000430c00440045010006666f726d6174010039284c6a6176612f6c616e672f537472696e673b5b4c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f537472696e673b0a000800470c004800490100077365744e616d65010015284c6a6176612f6c616e672f537472696e673b295607004b01001b6a6176612f7574696c2f66756e6374696f6e2f46756e6374696f6e010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c650100047468697301002b4c6f72672f7265646b616c652f7574696c2f416e6f6e796d6f75735669727475616c4578656375746f723b0100107468726561644e616d65466f726d61740100124c6a6176612f6c616e672f537472696e673b0100244c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b010007636f756e74657201002b4c6a6176612f7574696c2f636f6e63757272656e742f61746f6d69632f41746f6d6963496e74656765723b0100104d6574686f64506172616d6574657273010026284c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f4f626a6563743b01000e6c616d626461246170706c792430010089284c6a6176612f7574696c2f636f6e63757272656e742f546872656164466163746f72793b4c6a6176612f7574696c2f636f6e63757272656e742f61746f6d69632f41746f6d6963496e74656765723b4c6a6176612f6c616e672f537472696e673b4c6a6176612f6c616e672f52756e6e61626c653b294c6a6176612f6c616e672f5468726561643b010001720100144c6a6176612f6c616e672f52756e6e61626c653b010001740100124c6a6176612f6c616e672f5468726561643b010001630100014901000d537461636b4d61705461626c650700620100126a6176612f6c616e672f52756e6e61626c650700640100135b4c6a6176612f6c616e672f4f626a6563743b0700660100146a6176612f696f2f53657269616c697a61626c650100095369676e61747572650100694c6a6176612f6c616e672f4f626a6563743b4c6a6176612f7574696c2f66756e6374696f6e2f46756e6374696f6e3c4c6a6176612f6c616e672f537472696e673b4c6a6176612f7574696c2f636f6e63757272656e742f4578656375746f72536572766963653b3e3b01000a536f7572636546696c6501001d416e6f6e796d6f75735669727475616c4578656375746f722e6a617661010010426f6f7473747261704d6574686f64730f06006d0a006e006f0700700c007100720100226a6176612f6c616e672f696e766f6b652f4c616d6264614d657461666163746f727901000b6d657461666163746f72790100cc284c6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c6573244c6f6f6b75703b4c6a6176612f6c616e672f537472696e673b4c6a6176612f6c616e672f696e766f6b652f4d6574686f64547970653b4c6a6176612f6c616e672f696e766f6b652f4d6574686f64547970653b4c6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c653b4c6a6176612f6c616e672f696e766f6b652f4d6574686f64547970653b294c6a6176612f6c616e672f696e766f6b652f43616c6c536974653b10002c0f0600750a002300760c005800590f0600780a0079007a07007b0c0033007c0100246a6176612f6c616e672f696e766f6b652f537472696e67436f6e636174466163746f7279010098284c6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c6573244c6f6f6b75703b4c6a6176612f6c616e672f537472696e673b4c6a6176612f6c616e672f696e766f6b652f4d6574686f64547970653b4c6a6176612f6c616e672f537472696e673b5b4c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f696e766f6b652f43616c6c536974653b08007e01000330300108008001000230010800820100095669727475616c2d0101000c496e6e6572436c61737365730700850100186a6176612f6c616e672f546872656164244275696c6465720100074275696c6465720100094f665669727475616c0700890100256a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c6573244c6f6f6b757007008b01001e6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c65730100064c6f6f6b75700021002300020001004a000000040001000500060001004c0000002f00010001000000052ab70001b100000002004d0000000600010000000e004e0000000c000100000005004f005000000001002600270002004c0000006d000300040000001db80007b9000d01004dbb001359b700154e2c2d2bba00160000b8001ab000000002004d0000000e0003000000120009001300110014004e0000002a00040000001d004f005000000000001d005100520001000900140011005300020011000c00540055000300560000000501005100001041002600570002004c0000003300020002000000092a2bc00020b60022b000000002004d0000000600010000000e004e0000000c000100000009004f005000000056000000050100511000100a005800590001004c0000013000070006000000512a2db9002802003a042bb6002d360519042c04bd000259031505100aa2000d1505ba00310000a7001915051064a2000d1505ba00350000a700081505b80036b8003cba003f000053b80042b600461904b000000003004d0000001200040000001500090016000f0017004e0018004e0000003e000600000051001100530000000000510054005500010000005100510052000200000051005a005b000300090048005c005d0004000f0042005e005f00050060000000710003ff0029000607002907001307002007006107000801000507000807002007006307006301ff0010000607002907001307002007006107000801000507000807002007006307006301ff000400060700290700130700200700610700080100060700080700200700630700630107006500040067000000020068006900000002006a006b0000001e0004006c000300730074007300770001007d00770001007f00770001008100830000001a00030084000800860609000e0084008706090088008a008c0019"; + + private static final Function virtualExecutorFunction; + //org.redkale.util.SignalShutDown private static final String consumerSignalShutdownBinary = "cafebabe00000037006b0a0019003a090018003b07003c08003d08003e08003f0800400800410800420800430800440800450700460a000d00470a000d004807004907004a0a000d004b0a000d004c12000000500b001600510700520a0018005307005407005507005601001073687574646f776e436f6e73756d657201001d4c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723b0100095369676e61747572650100314c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723c4c6a6176612f6c616e672f537472696e673b3e3b0100063c696e69743e010003282956010004436f646501000f4c696e654e756d6265725461626c650100124c6f63616c5661726961626c655461626c65010004746869730100214c6f72672f7265646b616c652f7574696c2f5369676e616c53687574446f776e3b010006616363657074010020284c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723b29560100037369670100124c6a6176612f6c616e672f537472696e673b010004736967730100135b4c6a6176612f6c616e672f537472696e673b010008636f6e73756d65720100164c6f63616c5661726961626c65547970655461626c6501000d537461636b4d61705461626c6507002b0100104d6574686f64506172616d6574657273010034284c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723c4c6a6176612f6c616e672f537472696e673b3e3b295601000668616e646c65010014284c73756e2f6d6973632f5369676e616c3b29560100114c73756e2f6d6973632f5369676e616c3b010006736967737472010015284c6a6176612f6c616e672f4f626a6563743b295601007a4c6a6176612f6c616e672f4f626a6563743b4c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723c4c6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65723c4c6a6176612f6c616e672f537472696e673b3e3b3e3b4c73756e2f6d6973632f5369676e616c48616e646c65723b01000a536f7572636546696c650100135369676e616c53687574446f776e2e6a6176610c001f00200c001b001c0100106a6176612f6c616e672f537472696e670100034855500100045445524d010003494e54010004515549540100044b494c4c01000454535450010004555352310100045553523201000453544f5001000f73756e2f6d6973632f5369676e616c0c001f00570c003200580100136a6176612f6c616e672f457863657074696f6e0100136a6176612f6c616e672f5468726f7761626c650c0059005a0c005b005c010010426f6f7473747261704d6574686f64730f06005d08005e0c005f00600c0026003601001b6a6176612f7574696c2f66756e6374696f6e2f436f6e73756d65720c0026002701001f6f72672f7265646b616c652f7574696c2f5369676e616c53687574446f776e0100106a6176612f6c616e672f4f626a65637401001673756e2f6d6973632f5369676e616c48616e646c6572010015284c6a6176612f6c616e672f537472696e673b2956010043284c73756e2f6d6973632f5369676e616c3b4c73756e2f6d6973632f5369676e616c48616e646c65723b294c73756e2f6d6973632f5369676e616c48616e646c65723b0100076765744e616d6501001428294c6a6176612f6c616e672f537472696e673b0100096765744e756d6265720100032829490a00610062010005012c012c010100176d616b65436f6e63617457697468436f6e7374616e7473010038284c73756e2f6d6973632f5369676e616c3b4c6a6176612f6c616e672f537472696e673b49294c6a6176612f6c616e672f537472696e673b0700630c005f00670100246a6176612f6c616e672f696e766f6b652f537472696e67436f6e636174466163746f72790700690100064c6f6f6b757001000c496e6e6572436c6173736573010098284c6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c6573244c6f6f6b75703b4c6a6176612f6c616e672f537472696e673b4c6a6176612f6c616e672f696e766f6b652f4d6574686f64547970653b4c6a6176612f6c616e672f537472696e673b5b4c6a6176612f6c616e672f4f626a6563743b294c6a6176612f6c616e672f696e766f6b652f43616c6c536974653b07006a0100256a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c6573244c6f6f6b757001001e6a6176612f6c616e672f696e766f6b652f4d6574686f6448616e646c657300210018001900020016001a00010002001b001c0001001d00000002001e00040001001f0020000100210000002f00010001000000052ab70001b10000000200220000000600010000000c00230000000c000100000005002400250000000100260027000300210000014a000400080000006f2a2bb500021009bd0003590312045359041205535905120653590612075359071208535908120953591006120a53591007120b53591008120c534d2c4e2dbe360403360515051504a200222d1505323a06bb000d591906b7000e2ab8000f57a700053a07840501a7ffdda700044db100020051005f006200100005006a006d0011000400220000002a000a0000001200050014003b001500510017005f00190062001800640015006a001c006d001b006e001d00230000002a000400510013002800290006003b002f002a002b00020000006f0024002500000000006f002c001c0001002d0000000c00010000006f002c001e0001002e000000470006ff0044000607001807001607002f07002f01010000ff001d000707001807001607002f07002f01010700030001070010fa0001ff000500020700180700160000420700110000300000000501002c0000001d0000000200310021003200330002002100000060000300030000001a2b2bb600122bb60013ba001400004d2ab400022cb900150200b10000000200220000000e000300000021000f00220019002300230000002000030000001a0024002500000000001a002800340001000f000b0035002900020030000000050100280000104100260036000200210000003300020002000000092a2bc00016b60017b10000000200220000000600010000000c00230000000c00010000000900240025000000300000000501002c10000004001d000000020037003800000002003900660000000a00010064006800650019004d000000080001004e0001004f"; @@ -102,10 +106,32 @@ public final class Utility { Predicate strLatin1Function0 = null; ToLongFunction bufferAddrFunction0 = null; Consumer> signalShutdownConsumer0 = null; + Function virtualExecutorFunction0 = null; if (!"executable".equals(System.getProperty("org.graalvm.nativeimage.kind"))) { //not native-image try { final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + { //virtualExecutorFunction + Class> virtualClazz1 = null; + boolean virtual = false; + try { + Thread.currentThread().getContextClassLoader().loadClass("java.lang.Thread.Builder.OfVirtual"); + virtual = true; + virtualClazz1 = (Class) loader.loadClass("org.redkale.util.AnonymousVirtualExecutor"); + } catch (Throwable t) { + } + if (virtual && virtualClazz1 == null) { + byte[] classBytes = hexToBin(functionVirtualExecutorBinary); + virtualClazz1 = (Class>) new ClassLoader(loader) { + public final Class loadClass(String name, byte[] b) { + return defineClass(name, b, 0, b.length); + } + }.loadClass("org.redkale.util.AnonymousVirtualExecutor", classBytes); + RedkaleClassLoader.putDynClass(virtualClazz1.getName(), classBytes, virtualClazz1); + RedkaleClassLoader.putReflectionDeclaredConstructors(virtualClazz1, virtualClazz1.getName()); + virtualExecutorFunction0 = virtualClazz1.getConstructor().newInstance(); + } + } { //unsafe Field f = String.class.getDeclaredField("value"); final Class unsafeClass = loader.loadClass("sun.misc.Unsafe"); @@ -173,6 +199,7 @@ public final class Utility { strLatin1Function = strLatin1Function0; bufferAddrFunction = bufferAddrFunction0; signalShutdownConsumer = signalShutdownConsumer0; + virtualExecutorFunction = virtualExecutorFunction0; // try { // DEFAULTSSL_CONTEXT = javax.net.ssl.SSLContext.getInstance("SSL"); @@ -206,6 +233,10 @@ public final class Utility { return cpus; } + public static Function virtualExecutorFunction() { + return virtualExecutorFunction; + } + public static Consumer> signalShutdownConsumer() { return signalShutdownConsumer; }