Concurrency متوسط

اجلب عناوين URL كثيرة بالتوازي باستخدام الخيوط الافتراضية و HttpClient.

✕ Java 8
ExecutorService pool =
    Executors.newFixedThreadPool(10);
List<Future<String>> futures =
    urls.stream()
    .map(u -> pool.submit(
        () -> fetchUrl(u)))
    .toList();
// manual shutdown, blocking get()
✓ Java 21+
try (var exec = Executors
    .newVirtualThreadPerTaskExecutor()) {
    var results = urls.stream()
        .map(u -> exec.submit(
            () -> client.send(req(u),
                ofString()).body()))
        .toList().stream()
        .map(Future::join).toList();
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
♾️

خيط لكل طلب

لا حاجة لضبط حجم المجمع — خيط افتراضي لكل عنوان URL.

📖

كود بسيط

اكتب كوداً حجبياً مباشراً.

إنتاجية عالية

آلاف الطلبات المتزامنة بموارد ضئيلة.

الأسلوب القديم
مجمع خيوط + URLConnection
الأسلوب الحديث
الخيوط الافتراضية + HttpClient
منذ JDK
21
الصعوبة
متوسط
طلبات HTTP متزامنة مع الخيوط الافتراضية
متاح

متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)

تجعل الخيوط الافتراضية إنشاء خيط لكل طلب HTTP أمراً عملياً. مع HttpClient يستبدل ذلك أنماط ردود الاتصال غير المتزامنة المعقدة بكود حجب بسيط يتوسّع بشكل جيد.

مشاركة 𝕏 🦋 in