2012-11-26 12 views
8

aracılığıyla çalıştırıyorum Callable<String> var. Periyodik olarak ScheduledExecutorService.scheduleAtFixedRate() aracılığıyla çalıştırmak ve calcble üzerinde .call() davetleri tarafından döndürülen tüm Dizeleri bir listesini almak istiyorum. scheduleAtFixedRate olarak ben bu satırlar boyunca bir benim Callable sarar özel Runnable şey dışarı rulo gerekir bir Callable (sadece Runnable s) almaz: DoğalBelirli bir Callable'ı ScheduledExecutorService

final Callable<String> myCallable = ....; 
final ConcurrentLinkedQueue<String> results 
    = new ConcurrentLinkedQueue<String>(); 

Runnable r = new Runnable() { 
    @Override public void run() { 
    try { 
     results.add(myCallable.call()); 
    } catch (Exception e) { 
     results.add(null); // Assuming I want to know that an invocation failed 
    } 
    } 
}; 

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS); 

, benim kendi özel yayıyoruz önlemek istiyorum şey (özellikle çok iş parçacıklı kodda), bu yüzden bu tür bir toplama yapan bir JDK sınıfı var mı?

+0

hayır, sizin için bir koleksiyona çağrılabilir sonuçlarını koymak için jdk varolan yarar yoktur. – jtahlborn

+0

Ben de öyle düşündüm. Teşekkürler. –

cevap

0

Yukarıda yaptığınız şey, Callable uygulamanızı başka bir normal sınıf olarak ele almaktır. Kaldıranı bir ThreadPool yürütücüsüne göndermiyorsunuz. Callable.call() çağrısı ThreadPoolExecutor'ı kullanmaz.

İş parçacığı havuzlamasını kullanmak için Görevinizi (Runnable/Callable/ForkJoinTask, vb.) Bir ThreadPool'e göndermeniz gerekir. Yürütülen sonuçları bir kez toplamak için Vadeli İşlemleri kullanabilirsiniz.

ForkJoinPool, JDK 7'nin bir parçasını deneyebileceğiniz bir seçenektir. Görevleri çatallayın ve bunları kullanarak ForkJoinTask 'u kullanın. Neden Futures kullanmıyorsunuz? Tam olarak Görev durumunu ve sonucunu bilmek içindir.

şuna bakar mü: Using Callable to Return Results From Runnables