Bu projede, bir Manager
olay sıralaması gerçekleştirir ve olayın sonucunu döndürmek için geri arama kullanılır (geri arama Runnable
'u uzatmaz). Yönetici, olayları gönderen ayrı bir iş parçacığı üzerinde çalışır. Olaylar sona erdiğinde, aynı iş parçacığı geri aramaları çağırır. Bu, bir önceki etkinliğin geri dönüşünün sona ermesinden önce bir sonraki olayın gönderilmeyeceği anlamına gelir. Bunu önlemek için, yöneticinin her geri arama için yeni bir iş parçacığı oluşturmasını ve geri aramaları orada yürütmesini sağlamayı düşünüyorum. Bu çözüm tasarım uygulamaları açısından ne kadar iyidir ve bunu başarmak için daha iyi bir yol var mı?Yeni bir iş parçacığında Java geri çağırma yürütme
3
A
cevap
5
Basit Callback
kodu:
import java.util.concurrent.*;
import java.util.*;
public class CallBackDemo{
public CallBackDemo(){
System.out.println("creating service");
ExecutorService service = Executors.newFixedThreadPool(10);
try{
for (int i=0; i<10; i++){
Callback callback = new Callback(i+1);
MyCallable myCallable = new MyCallable((long)i+1,callback);
Future<Long> future = service.submit(myCallable);
//System.out.println("future status:"+future.get()+":"+future.isDone());
}
}catch(Exception err){
err.printStackTrace();
}
service.shutdown();
}
public static void main(String args[]){
CallBackDemo demo = new CallBackDemo();
}
}
class MyCallable implements Callable<Long>{
Long id = 0L;
Callback callback;
public MyCallable(Long val,Callback obj){
this.id = val;
this.callback = obj;
}
public Long call(){
//Add your business logic
System.out.println("Callable:"+id+":"+Thread.currentThread().getName());
callback.callbackMethod();
return id;
}
}
class Callback {
private int i;
public Callback(int i){
this.i = i;
}
public void callbackMethod(){
System.out.println("Call back:"+i);
// Add your business logic
}
}
çıkışı:
creating service
Callable:1:pool-1-thread-1
Call back:1
Callable:2:pool-1-thread-2
Call back:2
Callable:8:pool-1-thread-8
Call back:8
Callable:3:pool-1-thread-3
Call back:3
Callable:10:pool-1-thread-10
Callable:4:pool-1-thread-4
Call back:10
Callable:7:pool-1-thread-7
Call back:7
Callable:6:pool-1-thread-6
Call back:6
Callable:9:pool-1-thread-9
Callable:5:pool-1-thread-5
Call back:9
Call back:4
Call back:5
Özet:
- tercih tercih
ExecutorService
ileManager
değiştirin. Callaback
nesnesiniCallable/Runnable
nesnesine geçirebilir veyaCallable/Runnable
içineCallback
nesnesini oluşturabilirsiniz. Örneğimde,Callback
nesnesiniCallable
'a açıkça ilettim.Sonucu döndürmeden önce,
Callable
nesnesi,Callback
yöntemini çağırır. Mevcut etkinliğin yanıtını almazsanız devam etmeyi engellemek istiyorsanız, aşağıdaki satırın sadece uncomment'ı.System.out.println("future status:"+future.get()+":"+future.isDone());
Bunu önlemek ve çizgi yorumladı yukarıda dolayısıyla devam edeceğiz düşünüyorum. Callback
yöntem çağrısı için yeni iş parçacığı oluşturmanız gerekmez. Eşzamansız olarak Callback
olayını işlemek isterseniz, bir tane daha ExecutorService
oluşturabilir ve etkinliği gönderebilirsiniz.
2
Görevi yürüten iş parçacığı da olur, ayrıca geri arama işlemini de yürütürüm. Her defasında bir Thread oluşturmak yerine, bir ExecutorService kullanmanızı öneririm.
public static <T> void submit(ExecutorService service,
Callable<T> callable,
Consumer<T> callback) {
service.submit(() -> {
try {
callback.accept(callable.call());
} catch (Throwable t) {
// log the Throwable
}
});
}
İlgili konular
- 1. Python işlevini yürütme Ana iş parçacığında Kukla iş parçacığı içinde yürütme Kukla iş parçacığı
- 2. Yeni bir iş parçacığında nasıl hizmet başlatabilirim?
- 3. Java - yeni iş parçacığında süper anahtar kelime Runnable - sınıf
- 4. Ayrı bir iş parçacığında
- 5. WCF geri çağırma, proxy ve iş güvenliği
- 6. OutOfMemoryError ayrı bir Java iş parçacığı içinde
- 7. C# Yeni bir iş parçacığında bir yöntem çağırın
- 8. SensorEventListener ayrı iş parçacığında
- 9. XS'de Geri Çağırma geri çağırma oluşturma
- 10. Java Uygulaması'nda JavaScript geri çağırma nasıl kaydedilir?
- 11. Futures tek bir iş parçacığında mı yürütülüyor? (Scala)
- 12. OnStop() ana iş parçacığında çağrılıyor
- 13. Bir iş parçacığında THTTPReqResp bileşenini yok edemiyor
- 14. V8'i bir iş parçacığında nasıl kullanırım?
- 15. pdb başka bir iş parçacığında kırılamıyor?
- 16. Sadece bir iş parçacığında çalışan birkaç 'iş parçacığı' nasıl işlenir
- 17. Özel Geri Çağırma İşleyicisi
- 18. Geri çağırma tetikleyicilerini RhinoMocks ile kullanma
- 19. Web Audio API olayları ayrı bir iş parçacığında mı çalışıyor?
- 20. android onServiceConnected() ayrı bir iş parçacığında mı çağrılır?
- 21. Visual Studio'da yalnızca bir iş parçacığında hata ayıklama
- 22. Geri çağırma işlevlerinden gelen değişkenleri geri alma
- 23. Çoklu iş parçacığında TargetInvocationException'dan incelikle nasıl kurtarılır?
- 24. UI iş parçacığında viewbyid çağrılabilir mi?
- 25. Diğer iş parçacığında istisna nasıl hata ayıklanır?
- 26. "main" iş parçacığında özel durum java.util.UnknownFormatConversionException: Conversion = '.'?
- 27. "main" iş parçacığında özel durum java.lang.ClassNotFoundException:
- 28. Neden invokeLater ana iş parçacığında yürütülür?
- 29. Arka plan iş parçacığında LoadKeyboardLayout nasıl kullanılır?
- 30. İşlev yalnızca ana iş parçacığında çağrılabilir, neden?
Görev, "aygıt dışı" yürütülür. Bu BLE iletişimi için bir yöneticisidir. Yanıt BLE üzerinden alındıktan sonra geri arama gerçekleştirilir. Bu yüzden bunun için bir iş parçacığı oluşturma. – AmiguelS
@AmiguelS hala bu geri bildirimler için bir iş parçacığı havuzu kullanabilirsiniz. Bir iletişim kütüphaneniz varsa, bu genellikle mesajların geri bildirimi/bildirimi için bir iş parçacığına sahiptir. –