簡體   English   中英

Java在不阻塞主線程的情況下並行運行任務

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM