SORU
30 NİSAN 2009, PERŞEMBE


Nasıl görev önceliği Java 5'te bir ExecutorService kullanarak uygulamak?

Hangi değişen öncelikleri görevleri yapmak istiyorum iş parçacığı havuzu bir mekanizma hayata duyuyorum. Bu hizmet için yüksek öncelikli bir görev gönderme ve diğer görevler daha önce planlanan olmanı sağlayacak güzel bir tasarım istiyorum. Görev öncelikli görev bütünsel bir özellik kendisi bir Runnable umurumda değil Callable Bir görevi ifade ediyorum ya.

Şimdi, yüzeysel gibi görünüyor olabilir PriorityBlockingQueue olarak görev sıradaki benim ThreadPoolExecutor ama sıra içerir Runnable nesneleri, hangi olabilir veya olmayabilir Runnable görevler aldım sundu. Eğer 11 ** görevleri teslim ettim ayrıca, eğer, bu hiç harita nasıl net değil.

Bunu yapmanın bir yolu var mı? Gerçekten çok çok daha yanlış bu şekilde almak gibi olduğum için bu benim kendi değiil istiyorum.

(Bir kenara; Evet, böyle bir şey daha öncelikli işler için açlık imkanı farkındayım. Ekstra puan için (!) adalet makul bir garanti çözüm)

CEVAP
25 ŞUBAT 2012, CUMARTESİ


Makul bir şekilde bu sorunu çözdüm ve aşağıda kendime ileride ve Java Eşzamanlı kitaplıkları ile bu sorun haline çalışan başka biri için tarif edeceğim.

Daha sonra yürütme görevleri tutmak için araç olarak PriorityQueue kullanarak gerçekten doğru yönde bir harekettir. Sorun PriorityQueue genel Runnable örnekler içeren bir örneği olmalı, ve imkansız Runnable arayüz compareTo (veya) benzer aramak olmasıdır.

Sorun çözme üzerine. Uygulamakla oluştururken, PriorityQueue bir verilmelidir. Sıra daha uygun bir yerde sıralama yapmak için özel bir Karşılaştırıcı verilmelidir:

new PriorityBlockingQueue<Runnable>(size, new CustomTaskComparator());

Şimdi, CustomTaskComparator bir göz:

public class CustomTaskComparator implements Comparator<MyType> {

    @Override
    public int compare(MyType first, MyType second) {
         return comparison;
    }

}

Her şey çok yalındır bu noktaya bakıyor. Biraz yapışkan burada olur. Bir sonraki sorun Uygulamakla FutureTasks oluşturulması ile başa çıkmak için. Uygulamakla, newTaskFor kadar geçersiz kılmak zorundayız:

@Override
protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
    //Override the default FutureTask creation and retrofit it with
    //a custom task. This is done so that prioritization can be accomplished.
    return new CustomFutureTask(c);
}

c nereye yürütmek için çalıştığımızı Callable iştir. Şimdi, hadi CustomFutureTask inceleyin:

public class CustomFutureTask extends FutureTask {

    private CustomTask task;

    public CustomFutureTask(Callable callable) {
        super(callable);
        this.task = (CustomTask) callable;
    }

    public CustomTask getTask() {
        return task;
    }

}

getTask yöntemi dikkat edin. Kullanacak daha sonra yarattığımız CustomFutureTask bu özgün görev kapmak için buradayız.

Ve en son olarak idam etmeye çalıştığımız özgün görev değiştirme:

public class CustomTask implements Callable<MyType>, Comparable<CustomTask> {

    private final MyType myType;

    public CustomTask(MyType myType) {
        this.myType = myType;
    }

    @Override
    public MyType call() {
        //Do some things, return something for FutureTask implementation of `call`.
        return myType;
    }

    @Override
    public int compareTo(MyType task2) {
        return new CustomTaskComparator().compare(this.myType, task2.myType);
    }

}

Biz görev Comparable MyType Comparator gerçek temsilci uygulamalarını görebilirsiniz.

Ve bir de, bir Varis Java kütüphanelerini kullanarak önceliği özelleştirilmiş! Bükme biraz biraz alır, ama bulamamış olduğum en temiz. Bu kişiye yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • RayperEnglishKnight

    RayperEnglis

    24 Kasım 2008
  • Vortez

    Vortez

    27 Temmuz 2009

İLGİLİ SORU / CEVAPLAR