簡體   English   中英

等待線程完成執行

[英]Waiting for a thread to finish execution

Java新手在這里。 我正在使用第三方庫給我一個函數,比如F(),其輸出決定了我的邏輯。 所以我需要它的結果繼續我的代碼。

問題是F()做了一些I / O,因此產生了一個線程來完成這個功能。 他們給了我一些實現的回調,這些回調被調用來從線程返回狀態/值。 這很好,除了函數F()立即返回並且我的其余代碼繼續運行。 我不希望這樣,因為我必須根據F()的結果分配一些對象,所以我真的想等待F()真正完成。

這應該是人們經常遇到的問題。 處理這個問題的正確方法是什么? 這是我的設計或第三方庫中的問題嗎? 或者我不太了解圖書館?

為了完整起見,我正在開發一個Android應用程序,該庫是facebook sdk。 該函數是單點登錄函數authorize()。 雖然這是一個通用的問題,我認為最好在Java論壇中解決。

謝謝你的幫助。 - P.

我不熟悉facebook SDK,但處理異步操作的常規機制是Callable <>或Future <>接口:你要創建一個服務執行器,傳入Callable <>或Future <>,然后繼續你的代碼。

可以從Future <> javadoc找到一個例子: http//download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html

另見StackOverflow問題/答案如何從Callable()返回對象

想一想:
Android應用程序的主要線程是管理UI的線程,因此如果要等到方法f()完成,屏幕將凍結。 您可能會認為一個好的解決方案是生成一個新線程並在其中調用方法f()並使用callable或future來等待f()。 錯誤。 線程創建下面的代碼將執行,因此您將遇到相同的問題。
那怎么解決這個問題呢? 簡單。 重新設計您的應用程序並使用監聽器,即回調。

編輯 :偵聽器或回調只是一個類A實現的方法(或方法),並將此實現傳遞給類B來執行它。 B級不知道他正在執行什么,他只是執行一個方法。

例:

public class A{
    public A (){
        B b = new B (new B.Listener (){
            @Override
            void onResult (String result){
                //result is "Core dumped!"
            }
        });
        b.aMethod ();
    }
}

public class B{
    private final Listener listener;

    public static interface Listener{
        void onResult (String result);
    }

    public B (Listener listener){
        if (listener == null) throw new IllegalArgumentException ("The \"listener\" parameter cannot be null.");
        this.listener = listener;
    }

    public void aMethod (){
        //Do something interesant
        //...
        String error = "Core dumped!"

        //Call the listener
        listener.onResult (error);
    }
}

在你的情況下,你將有類似的東西:

public class YourClass{
    public void aMethod (){
        FaceBookClass fb = new FaceBookClass ();
        fb.setListenerToF (new FaceBookClass.FListener (){
            @Override
            void theCallback (Result aResult){
                //Do something with result
            }
        });
        fb.f ();

    }
}

public class FaceBookClass{
    public static interface FListener{
        void theCallback (Result aResult);
    }

    public void f (){
        ...
    }

    public void setListenerToF (FListener listener){
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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