标签: java-21

MemoryLayout::varHandle 通过可变数组进行结构化的问题

在使用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)

java project-panama java-21

1
推荐指数
1
解决办法
109
查看次数

何时调用密封层次结构 switch 中的默认情况

给出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 switch-statement java-21

1
推荐指数
1
解决办法
264
查看次数

为java中的平台线程池创建单独的线程池

我想创建在单独的 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

0
推荐指数
1
解决办法
245
查看次数

可以使用每任务虚拟线程 ExecutorService 来执行 PlatformThread 吗?

我知道应该使用 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.

java multithreading virtual-threads java-21

-1
推荐指数
1
解决办法
144
查看次数