In diesem Projekt führt eine Manager
Ereigniswarteschlange aus, und um das Ergebnis des Ereignisses zurückzugeben, wird ein Rückruf verwendet (der Rückruf erweitert sich nicht). Der Manager läuft in einem separaten Thread und versendet die Ereignisse. Sobald die Ereignisse enden, ruft derselbe Thread die Rückrufe auf. Das bedeutet, dass das nächste Ereignis nicht ausgelöst wird, bevor der Rückruf des vorherigen Ereignisses beendet wird. Um dies zu vermeiden, habe ich mir vorgenommen, dass der Manager für jeden Callback einen neuen Thread erstellt und die Callbacks dort ausführt. Wie gut ist diese Lösung in Bezug auf Design-Praktiken, und gibt es einen besseren Weg, dies zu erreichen?Java-Callback für einen neuen Thread ausführen
Antwort
Ein einfacher Callback
Code:
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
}
}
Ausgang:
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
Zusammenfassung:
- ersetzen
Manager
mitExecutorService
Ihrer bevorzugten Wahl. - Entweder können Sie
Callaback
Objekt anCallable/Runnable
Objekt übergeben oder Sie könnenCallback
Objekt innerhalbCallable/Runnable
erstellen. In meinem Beispiel habe ichCallback
Objekt explizit anCallable
übergeben. Bevor das Ergebnis zurückgegeben wird, ruft
Callable
ObjektCallback
Methode auf. Wenn Sie die Weiterverarbeitung blockieren möchten, außer Sie erhalten eine Antwort vom aktuellen Ereignis, kommentieren Sie einfach unter Zeile.System.out.println("future status:"+future.get()+":"+future.isDone());
Ich glaube, Sie es zu vermeiden, gehen und daher halten über der Linie kommentiert. Sie müssen keinen neuen Thread für den Methodenaufruf Callback
erstellen. Wenn Sie das Ereignis Callback
asynchron verarbeiten möchten, können Sie ein weiteres ExecutorService
erstellen und das Ereignis absenden.
Ich hätte den Thread, der die Aufgabe ausführt, führen Sie auch den Rückruf aus. Anstatt jedes Mal einen Thread zu erstellen, schlage ich vor, dass Sie einen ExecutorService verwenden.
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
}
});
}
- 1. Einen EventHandler für einen Thread ausführen
- 2. Lokale Benachrichtigungen für einen neuen Thread festlegen?
- 3. Verwendet Stream.parallel() einen neuen Thread?
- 4. pid für neuen Thread
- 5. Erstellt performSelectorInBackground einen neuen Thread für jeden Anruf?
- 6. Einen Socket-Stream in einem Thread ausführen
- 7. So erstellen Sie einen neuen Thread zum Ausführen einer Aktion <T>
- 8. Wenn wir einen neuen .NET-Thread erstellen und starten, erstellt er dann einen neuen Thread auf Betriebssystemebene?
- 9. Warum neuen Thread statt Zukunft {...}
- 10. Methode im neuen Prozess ausführen
- 11. Wie erstellt man einen Server, der für jeden Client einen neuen Thread erstellt?
- 12. Hinzufügen von Java-Klasse-Methoden in einen neuen Thread
- 13. ASP.NET Postback erstellt einen neuen Thread und eine neue Sitzung
- 14. Python-Klasseninstanz startet Methode im neuen Thread
- 15. Öffnen eines wx.Frame in Python über einen neuen Thread
- 16. C# timer in neuen Thread
- 17. Java macht javax.swing.Timer auf neuen Thread laufen?
- 18. AsyncCallback für einen Thread auf kompaktem Framework
- 19. Was hält C++ 11 für einen "Thread"?
- 20. Server vergibt keinen Thread für jeden neuen Client (Sockets)
- 21. Einfache Möglichkeit, Methode in neuen Thread
- 22. Kann ich einen Thread innerhalb eines Threads in Java ausführen?
- 23. Android: Standard Weg, um einen Thread pro Sekunde ausführen
- 24. Warum einen neuen Thread mit startAsync erstellen, anstatt im Servlet-Thread zu arbeiten?
- 25. Wie Informationen in neuen Thread übergeben werden (..);
- 26. Fehler: kann keine neuen Thread starten
- 27. Wann verwendet handler.post() & wenn neuen Thread()
- 28. Vorschläge für einen neuen IDE/Texteditor
- 29. Socket geschlossen, sobald in neuen Thread übergeben
- 30. Qt - Griff QTcpSocket in einem neuen Thread
Die Task wird "off-device" ausgeführt. Dies ist ein Manager für BLE-Kommunikation. Sobald die Antwort über BLE empfangen wurde, wird der Rückruf ausgeführt. Daher das Erschaffen eines Threads dafür. – AmiguelS
@AmiguelS Sie können immer noch einen Thread-Pool für diese Rückrufe verwenden. Wenn Sie eine Kommunikationsbibliothek haben, hat diese normalerweise einen Thread für Rückrufe/Benachrichtigung von Nachrichten. –