在使用MemoryLayout::varHandle构造varHandle时,我传入了一个自组装的Object数组来实现构造MemorySegment的公共方法。但是,我发现它似乎阻止我使用对象数组而不是可变数组。
代码片段如下。
public static MemorySegment buildMemorySegment(Object object, MemorySegment memorySegment, MemoryLayout originMemoryLayout, MemoryLayout memoryLayout, List<PathElement> pathElements, List<Object> indexParams) throws NoSuchFieldException, IllegalAccessException {
Class<?> aClass = object.getClass();
if (memoryLayout instanceof SequenceLayout sequenceLayout) {
pathElements.add(PathElement.sequenceElement());
for (int i = 0; i < sequenceLayout.elementCount(); i++) {
Object[] array;
if (Collection.class.isAssignableFrom(aClass)) {
assert object instanceof Collection<?>;
Collection<?> collection = (Collection<?>) object;
array = collection.toArray();
} else {
assert object instanceof Object[];
array = ((Object[]) object);
}
Object o = array[i];
indexParams.add((long) i);
buildMemorySegment(o, memorySegment, originMemoryLayout, …Run Code Online (Sandbox Code Playgroud) 给出sealed如下层次结构
sealed interface Shape permits Rectangle, Square
record Rectangle() implements Shape
record Square() implements Shape
Run Code Online (Sandbox Code Playgroud)
由于Rectangle&Square是记录,它本质上使整个层次结构不可扩展,即不再允许有更多的子类。
从 JDK 21 开始,模式匹配switch强制 switch 通过覆盖所有可能的内容case或提供一个default案例来覆盖其余内容,从而实现详尽无遗。
因此,在下面switch什么情况下default会执行案例,因为涵盖了所有可能的组合,为什么甚至允许这样做?
switch (shape) {
case Rectangle r -> // do something with r;
case Square sq -> // do something with sq;
case null -> // shape could be null
default -> // WHY is this permitted when all possible cases are …Run Code Online (Sandbox Code Playgroud) 我想创建在单独的 Java 线程池上运行的虚拟线程池。
这是我试图创建的架构:
这是为了让我能够创建单独的池来在一个 JVM 中运行批处理任务,并利用每个池的 n:m 映射的虚拟线程。因此,如果我有 12 个核心,那么我可以创建 2 个 6 线程的线程池。每个池只会执行一个特定的任务。每个池将有 N 个虚拟线程。因此,这里的映射将是 2 个 {N VirtualThreads -> 6 Platform Threads} 池。
TLDR,我想限制虚拟线程池可以运行的 PlatformThreads 数量。
我能想到的一件事是,创建线程池,当传入可运行对象时,在 run 方法内我可以创建虚拟线程,但不确定它有多实用,以及我是否会得到我想要的池分区。这种方法的另一个问题是,虚拟线程将仅在一个 java 线程中运行,因此没有 N:M 映射
java threadpoolexecutor java-threads virtual-threads java-21
我知道应该使用 a 来用新的虚拟线程包装所有任务VirtualThread,而不是使用 pooling s,因为这并不能真正带来好处。Executors.newVirtualThreadPerTaskExecutor()
我想知道是否应该阻止PlatformThread使用这样的执行者执行 a ,并且通常Threads 是否完全不应该传递给执行者。
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
Runnable platformThread = Thread.ofPlatform().unstarted(someTask);
executor.execute(platformThread);
}
Run Code Online (Sandbox Code Playgroud)
ThreadFactory由于执行器的原因,以这种方式创建的平台线程将被虚拟线程包装。我试图了解这是否有意义,或者通常Thread对象是否不应该传递给ExecutorServices.