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
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!