动机: 尝试迁移虚拟线程。
问题: 尽管虚拟线程很便宜,但操作系统可能会发现同时堆叠某些进程很可疑,例如在网络上搜索 IP 或端口。
代码:我使用下面的代码来限制线程的创建。 TS_NetworkIPUtils TS_NetworkPortUtils
var executor = useVirtualThread
? Executors.newVirtualThreadPerTaskExecutor()
: Executors.newFixedThreadPool(MAX_THREAD_COUNT());
问题:是否可以创建一个执行器服务来创建虚拟线程并同时具有限制功能?
您可以使用计数信号量来限制虚拟线程中同时运行的任务数量。请参阅 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();
}
}
);
}
}