// Создание простого пула потоков
ExecutorService executor = Executors.newFixedThreadPool(10);
// Отправка задачи на выполнение
Future<String> future = executor.submit(() -> {
// Какая-то долгая операция
Thread.sleep(1000);
return "Результат выполнения";
});
// Получение результата (блокирующая операция)
String result = future.get(); public class ImageProcessor {
private final ExecutorService executor;
public ImageProcessor(int threadCount) {
// Создаем пул потоков фиксированного размера
this.executor = Executors.newFixedThreadPool(threadCount);
}
public List<ProcessedImages> processImages(List<Image> images) {
List<Future<ProcessedImages>> futures = new ArrayList<>();
// Отправляем каждую картинку на обработку в отдельном потоке
for (Image image : images) {
Future<ProcessedImages> future = executor.submit(() -> {
// Долгая операция обработки изображения
return processImage(image);
});
futures.add(future);
}
List<ProcessedImages> results = new ArrayList<>();
// Собираем результаты
for (Future<ProcessedImages> future : futures) {
try {
results.add(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
return results;
}
private ProcessedImages processImage(Image image) {
// Реальная обработка изображения
// ...
}
}
// Традиционный подход
Thread.startVirtualThread(() -> {
System.out.println("Выполнение в виртуальном потоке");
});
// Использование ExecutorService с виртуальными потоками
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
Future<?> future = executor.submit(() -> {
System.out.println("Задача в виртуальном потоке");
return "Результат";
});
// Получаем результат
String result = (String) future.get();
}
public class VirtualThreadWebServer {
private static final int PORT = 8080;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Сервер запущен на порту " + PORT);
// Создаем ExecutorService с виртуальными потоками
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
while (true) {
// Принимаем входящее соединение
Socket clientSocket = serverSocket.accept();
// Обрабатываем запрос в виртуальном потоке
executor.submit(() -> handleRequest(clientSocket));
}
}
}
private static void handleRequest(Socket clientSocket) {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream())) {
// Читаем HTTP-запрос
String requestLine = in.readLine();
if (requestLine == null) return;
System.out.println("Получен запрос: " + requestLine);
// Отправляем HTTP-ответ
out.println("HTTP/1.1 200 OK");
out.println("Content-Type: text/plain");
out.println();
out.println("Ответ от сервера на виртуальных потоках!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class ThreadPerformanceComparison {
private static final int TASK_COUNT = 10000;
public static void main(String[] args) throws InterruptedException {
System.out.println("Тестирование производительности потоков...");
// Тест с традиционными потоками
long startTime = System.currentTimeMillis();
try (ExecutorService executor = Executors.newFixedThreadPool(100)) {
for (int i = 0; i < TASK_COUNT; i++) {
executor.submit(() -> blockingOperation());
}
}
long platformTime = System.currentTimeMillis() - startTime;
// Тест с виртуальными потоками
startTime = System.currentTimeMillis();
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < TASK_COUNT; i++) {
executor.submit(() -> blockingOperation());
}
}
long virtualTime = System.currentTimeMillis() - startTime;
System.out.println("Время выполнения с традиционными потоками: " + platformTime + " мс");
System.out.println("Время выполнения с виртуальными потоками: " + virtualTime + " мс");
System.out.println("Ускорение: " + (double) platformTime / virtualTime + " раз");
}
private static void blockingOperation() {
try {
// Имитация блокирующей операции (например, запрос к БД)
Thread.sleep(10);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}