java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

问题描述 投票:0回答:1

动机: 尝试迁移虚拟线程。

问题: 尽管虚拟线程很便宜,但操作系统可能会发现同时堆叠某些进程很可疑,例如在网络上搜索 IP 或端口。

代码:我使用下面的代码来限制线程的创建。 TS_NetworkIPUtils TS_NetworkPortUtils

var executor = useVirtualThread
                    ? Executors.newVirtualThreadPerTaskExecutor()
                    : Executors.newFixedThreadPool(MAX_THREAD_COUNT());

问题:是否可以创建一个执行器服务来创建虚拟线程并同时具有限制功能?

java executorservice virtual-threads
1个回答
0
投票

您可以使用计数信号量来限制虚拟线程中同时运行的任务数量。请参阅 Cay Horstmann 的教程 虚拟线程中的速率限制部分。

private final Semaphore TASKS_PERMITS = new Semaphore( 5 );
try (
    ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor();
)
{
    for ( int nthTask = 1 ; nthTask <= 20 ; nthTask ++ )
    {
        executorService.submit (
            () -> 
            {
                TASKS_PERMITS.acquire() ;
                try 
                {
                    LockSupport.parkNanos( ThreadLocalRandom.nextInt( Duration.ofSeconds( 2 ).toNanos() , Duration.ofSeconds( 10 ).toNanos() ) ;
                    System.out.println( "nthTask " + nthTask + " at " + Instant.now() ) ;
                } 
                finally 
                {
                   TASKS_PERMITS.release();
                }
             }
        );
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.