При использовании виртуальных потоков не отправляется REST запрос на API

Я хочу написать программу, которая будет слать на мою апи тысячи сообщений в секунду. Для этого я хочу использовать виртуальные треды:

import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;

import java.util.UUID;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;

public class Main {
    private final static String target = "https://01hdpvezxneb5bweqrstdxagdp00-9c86fc9c1e60a225c441.requestinspector.com";

    private static AtomicLong counter = new AtomicLong(0);

    public static void main(String[] args) {
        //Unirest.config().proxy("127.0.0.1", 9051);

        try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
            IntStream.range(0, 10000).forEach(i -> {
                exec.submit(Main::job);
            });
        }
    }
    
    private static void job() {
        while (true) {
            System.out.println(counter.incrementAndGet());
            try {
                send();
            } catch (Exception ignored) {

            }
        }
    }

    private static int send() {
        HttpResponse<JsonNode> response = Unirest.post(target)
                .multiPartContent()
                .header("User-Agent", UUID.randomUUID().toString())
                .field("name", "hi")
                .asJson();

        System.out.println("Status: " + response.getStatus());
        System.out.println(response.getBody());

        return response.getStatus();
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.konghq</groupId>
            <artifactId>unirest-java</artifactId>
            <version>3.14.5</version>
        </dependency>
    </dependencies>

</project>

Проблема в том, что все это виснет в тот момент, когда должна происходить отправка сообщения. В лог выводятся числа от 1 до 30 максимум в разном порядке, а ответ от апи не распечатывается. В дебагере я не могу дождаться получения ответа от апи, он не приходит. Почему так? Как заставить программу работать?


Ответы (1 шт):

Автор решения: Wonderf

Как я понял из документации виртуальные потоки ждут когда им разрешат работать.

Если достаточно долго подождать то будет в консоли приходить ответ.

Для вашей задачи лучше использовать другой вид потоков.

var exec = Executors.newCachedThreadPool()
→ Ссылка