我有一對夫婦的申請runAsync()
。這些runAsync()
呼叫各種其他方法,我想在每個方法之前但在同一個執行緒中運行一些代碼。
因此,例如我有主執行緒,然后我呼叫runAsync(MyClass::myMethod)
,創建 Thread1 并在myMethod()
呼叫之前,在同一個執行緒 (Thread1) 中呼叫另一個方法。
我認為這將涉及某種包裝器,但由于它使用 lambda 運算式和異步執行緒,我對如何完成有點迷茫。
提前致謝
編輯:我想澄清一下methodToRunBeforeAsync()
應該對其他開發人員隱藏。像使用包裝器這樣的東西,所以你不必擔心打電話給methodToRunBeforeAsync()
uj5u.com熱心網友回復:
為了圍繞這些 lambda 運行代碼,有幾個選項。一種是 AOP,但設定起來可能很復雜,因此如果您能夠更改呼叫,則可以執行以下操作:
選項 1:創建 WrapperRunnable
只需創建一個包裝器/裝飾器來執行您需要的任何附加代碼。您可以在需要 a 的任何地方使用該方法Runnable
。
class WrapperRunnable implements Runnable {
Runnable delegate;
WrapperRunnable(Runnable r) {
delegate= r;
}
public void run() {
//any code before
delegate.run();
//any code after
}
}
用法:CompletableFuture.runAsync(new WrapperRunnable(MyClass::myMethod))
選項 2:包裝 runAsync()
提供您自己的runAsync(Runnable)
方法,在內部創建一個裝飾器 lambda 或使用選項 1 中定義的裝飾器。它在CompletableFuture.runAsync()
內部呼叫并且只能用作此方法的替代品。
class MyCompletables {
public static CompletableFuture<Void> runAsync(Runnable runnable) {
return CompletableFuture.runAsync(() -> {
//any code before
runnable.run();
//any code after
});
}
}
使用選項 1 的裝飾器:
class MyCompletables {
public static CompletableFuture<Void> runAsync(Runnable runnable) {
return CompletableFuture.runAsync(new WrapperRunnable(runnable));
}
}
用法:MyCompletables.runAsync(MyClass::myMethod)
請注意,還有其他選項,有些更靈活,有些更優雅,但這應該可以讓您開始,同時仍然易于理解。
uj5u.com熱心網友回復:
像這樣的東西?只需包裝任務并確保人們使用myRunAsync
而不是標準任務。顯然,給它一個更好的名字。
public static void main(String[] args) {
myRunAsync(() -> System.out.println("Task")).join();
}
private static CompletableFuture<Void> myRunAsync(Runnable runnable) {
return CompletableFuture.runAsync(() -> {
preTask();
runnable.run();
});
}
private static void preTask() {
System.out.println("Pre");
}
uj5u.com熱心網友回復:
一個簡單的例子是:
runAsync(() -> {
myOtherObject.myMethodToRunBefore();
myObject.myMethod();
}
)
您可以在主體 myMethod() 的第一行添加對 myMethodToRunBefore() 的呼叫,也可以創建包裝器物件。選擇取決于是否應該將 myMethod 與對 myMethodToRunBefore 的呼叫分開(然后使用包裝器)或者它們總是需要以相同的順序一起呼叫(然后在 myMethod 的第一行添加對 beforeMethod 的呼叫)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/508474.html