[英]Java Run a task parallel to main thread without blocking it
我正在嘗試使用Java 8的CompletableFuture功能,該功能表示它具有異步運行的功能。 但是,為了執行“未來”中的內容,需要調用future.get()
方法。 這樣做會阻塞主線程。 因為它等待30秒的睡眠,然后在執行future.get()
之后的行
有沒有辦法做到這一點? 做我嘗試打印的執行非阻塞方式
“我將在主線程中運行。”
之前
“我將在與主線程不同的線程中運行。”
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Void> future = CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
// Simulate a long-running Job
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
System.out.println("I'll run in a separate thread than the main thread.");
}
});
future.get();
System.out.println("I'll run in the main thread.");
}
CompletableFuture.runAsync(Runnable)
已經開始運行其他線程。 調用future.get()
只是在繼續執行該線程之前,等待該線程完成運行並獲取其結果的一種方法。
當您啟動線程並立即get
它,而又沒有做任何事情時(如您所做的),那么就沒有必要運行線程了。
如果我理解正確的話,您要實現的目標將不是一件容易的事。 您有一個進入的呼叫,並且您希望在不干擾的情況下處理此呼叫,並且希望在此線程的旁邊運行獨立於主進程的單獨進程。 (如果我誤會了,請糾正我)
我要解決此問題的方法是使用隊列。 您的主線程將某些內容發布到隊列中並執行需要執行的內容。 然后,有單獨的使用者在隊列上偵聽,這將執行其他過程而不會影響主線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.