طلبات HTTP متزامنة مع الخيوط الافتراضية
اجلب عناوين 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
الصعوبة
متوسط
دعم JDK
طلبات HTTP متزامنة مع الخيوط الافتراضية
متاح
متاح على نطاق واسع منذ JDK 21 LTS (سبتمبر 2023)
كيف يعمل
تجعل الخيوط الافتراضية إنشاء خيط لكل طلب HTTP أمراً عملياً. مع HttpClient يستبدل ذلك أنماط ردود الاتصال غير المتزامنة المعقدة بكود حجب بسيط يتوسّع بشكل جيد.
توثيق ذو صلة