, dass Sie Java 8
ein guter Weg, es ist mit CompletableFuture
zu implementieren verwenden Unter der Annahme, da es einen Fluss von asynchronen Aufgaben zu definieren, ermöglicht es auszuführen.
So zum Beispiel hier der Hauptcode könnte sein:
// Call connect asynchronously using the common pool from a given thread
// then execute someMethod using another thread
CompletableFuture.supplyAsync(MyClass::connect)
.thenCompose(MyClass::someMethodAsync);
Verfahren connect
der Klasse MyClass
sein könnte:
public static int connect() {
try {
SomeClass obj = makeConnection();
// ok so we return a positive value
return obj.getCurrentId();
} catch (Exception e) {
// Do something here
}
// ko so we return a negative value
return -1;
}
Verfahren someMethodAsync
der Klasse MyClass
könnte sein:
public static CompletionStage<Void> someMethodAsync(int id) {
return CompletableFuture.supplyAsync(() -> MyClass.someMethod(id));
}
Die Methode someMethod
der Klasse MyClass
könnte sein:
public static Void someMethod(int id) {
if (id > 0) {
// do something
}
return null;
}
Ein weiterer Ansatz könnte auf wait
/notify
/notifyAll
oder await
/signal
/signalAll
verlassen, um den anderen Thread zu benachrichtigen, dass die id
geändert hat.
So könnte Ihr Code so ähnlich sein:
public class SomeClass {
/**
* The current id
*/
private int currentId;
/**
* The object's monitor
*/
private final Object monitor = new Object();
/**
* @return the current id
*/
public int getCurrentId() {
synchronized (monitor) {
return this.currentId;
}
}
/**
* Sets the current id and notifies waiting threads
*/
public void setCurrentId(final int currentId) {
synchronized (monitor) {
this.currentId = currentId;
monitor.notifyAll();
}
}
/**
* Makes the calling thread wait until the id is positive
* @throws InterruptedException if current thread is interrupted while waiting
*/
public void waitForPositiveId() throws InterruptedException {
synchronized (monitor) {
while (currentId <= 0) {
monitor.wait();
}
}
}
}
So Ihre erste Thread wird makeConnection()
rufen Sie einfach an, dass intern vorausgesetzt, es ist die Setter setCurrentId
von SomeClass
und den zweiten Thread von waitForPositiveId()
Aufruf startet ruft zu machen warte bis die ID positiv ist.
Hinweis: Dieser Ansatz wird den zweiten Thread für immer warten lassen, wenn makeConnection()
fehlschlägt.
So wollen Sie die Verbindung verwenden, erst nach dem Herstellen der Verbindung erfolgreich ist. Warum nicht einen Thread für beides verwenden? Threads sind für gleichzeitige Aufgaben. –
Weil es Zeit braucht, um tatsächlich eine Verbindung zum Server herzustellen und damit die ID positiv wird. Wenn ich beide Aufgaben unter einem Thread zusammenführe, befürchte ich, dass der Code "überprüfe, ob die ID positiv ist" ausgeführt wird, wenn die vollständige Verbindung noch nicht vollständig hergestellt ist. – user1769197
Warum also zwei Threads lösen dieses Problem. Wenn Sie einen Thread verwenden, wissen Sie zumindest, dass Sie die Verbindung erst verwenden können, wenn makeConnection() zurückgegeben wurde. –