2016-09-29 2 views
0

Gibt es in Java eine Möglichkeit, asynchrone Methoden innerhalb eines Threads aufzurufen und zu verarbeiten?Wie asynchrone Methode innerhalb von Java-Thread aufrufen?

Betrachten Sie ein Szenario, in dem eine der Methoden im Thread-Körper mehr Zeit benötigt, um sie auszuführen. Aus diesem Grund dauert die Fertigstellung des Threads länger.

Ich habe einige Beispiele versucht, indem ich Concurrency-Paketklassen wie FutureTask und Executors verwende.

Ist es möglich, alle Ausnahmen innerhalb der asynchronen Methode zu implementieren und zu behandeln? und Ist es möglich, Erfolgs- oder Fehlerreaktionen wie AJAX-Erfolg und Fehlerhandler in JavaScript zu erhalten?

Wie stellen wir sicher, dass die asynchrone Methode erfolgreich ausgeführt wurde oder nicht (mit oder ohne übergeordneten Threadkontext)?

+3

Natürlich. Selbst im einfachsten Fall haben Sie den Hauptthread. Wenn Sie also Methoden asynchron aufrufen können, können Sie sie aus einem Thread aufrufen. Das Paket 'java.util.concurrent' ist definitiv der beste Startpunkt. – Kayaman

+0

Aber wie stellen wir sicher, dass die asynchrone Methodenausführung erfolgreich ist oder nicht? Können Sie ein Beispiel für dieses Szenario geben? –

+1

Gleich wie synchrone Methoden. Rückgabewerte oder Ausnahmen Die Ausnahmebehandlung unterscheidet sich ein wenig aufgrund der asynchronen Natur, aber es ist alles in der Dokumentation. – Kayaman

Antwort

0

natürlichste Weg der Kommunikation zwischen async Verfahren und Muttergewinde Standardklasse CompletableFuture:

import java.util.concurrent.CompletableFuture; 
import java.util.concurrent.ExecutionException; 

public class AsyncExample { 
    String input; // common data 

    // async method 
    public String toLower() { 
     return input.toLowerCase(); 
    } 

    // method on main thread 
    public void run() { 
     input = "INPUT"; // set common data 
     try { 
      // start async method 
      CompletableFuture<String> future = CompletableFuture.supplyAsync(this::toLower); 
      // here we can work in parallel 
      String result = future.get(); // get the async result 
      System.out.println("input="+input+"; result="+result); 
     } catch (InterruptedException | ExecutionException e) { 
     } 
    } 

    public static void main(String[] args) { 
     new AsyncExample().run(); 
    } 
} 

anzumerken, dass Erzeugung und Erwärmung eines Executor, einschließlich der Exekutor Standard in dem Beispiel verwendet wird, einige Zeit benötigt (50 ms auf meinem Computer), also möchten Sie vielleicht vorher einen erstellen und wärmen, z durch ein leeres Verfahren liefert:

 CompletableFuture.supplyAsync(()->null).get(); 
Verwandte Themen