Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待线程完成执行_Java_Multithreading - Fatal编程技术网

Java 等待线程完成执行

Java 等待线程完成执行,java,multithreading,Java,Multithreading,这里是Java新手。我使用的是第三方库,它给了我一个函数,比如F(),它的输出决定了我的逻辑。所以我需要它的结果在我的代码中继续 问题是F()执行了一些I/O操作,因此产生了一个线程来执行该功能。他们给了我一些回调来实现,这些回调被调用来从线程返回状态/值。这很好,只是函数F()立即返回,其余代码保持运行。我不想这样,因为我必须根据F()的结果分配一些对象,所以我真的想等待F()真正完成 这应该是人们经常遇到的问题。正确的处理方法是什么?这是我的设计中的问题还是第三方库中的问题?还是我对图书馆不

这里是Java新手。我使用的是第三方库,它给了我一个函数,比如F(),它的输出决定了我的逻辑。所以我需要它的结果在我的代码中继续

问题是F()执行了一些I/O操作,因此产生了一个线程来执行该功能。他们给了我一些回调来实现,这些回调被调用来从线程返回状态/值。这很好,只是函数F()立即返回,其余代码保持运行。我不想这样,因为我必须根据F()的结果分配一些对象,所以我真的想等待F()真正完成

这应该是人们经常遇到的问题。正确的处理方法是什么?这是我的设计中的问题还是第三方库中的问题?还是我对图书馆不是很了解

为了完整性,我正在开发一个android应用程序,这个程序库就是facebook sdk。该函数是单点登录函数authorize()。尽管这是一个足够普遍的问题,我认为最好在Java论坛中解决

谢谢你的帮助。
-P

我不熟悉facebook SDK,但处理此类异步操作的正常机制是可调用或未来接口:您需要创建一个服务执行器,传入可调用或未来接口,然后继续编写代码

可以从未来的javadoc中找到一个示例:

另请参见StackOverflow问题/答案

思考一下:
android应用程序的主线程是管理UI的线程,因此如果要等到方法f()完成,屏幕将冻结。您可能会认为一个好的解决方案是生成一个新线程并在其中调用方法f(),然后使用可调用或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){
        ...
    }
}

正是我的问题!你明白了!FB sdk提供了wait()方法,但如果我在主线程中调用它,这并不能解决问题,因为它只会冻结屏幕。这是什么?我得检查一下。你能提供一个链接吗?问题是我的观点是根据登录操作的结果得出的。谢谢你的回答。在这种情况下,b.aMethod()的行为是什么?它会等待回调吗?因为aMethod()本质上是创建一个线程并在该线程中执行有趣的部分。具体地说,在我的例子中,functin F()接受的是DialogListener而不是构造函数。所以我传入它,但是F()立即返回,并且在调用回调的某个点之后返回。但是,您确实希望在继续执行其余逻辑之前等待调用回调。Ok。我决定不把我的逻辑建立在F()的结果上。我将有一个中间状态,在该状态下,我将向用户显示他是否已登录,并让他相应地单击某些内容。b.aMethod()将异步执行侦听器实现(将调用onResult(String)),就在aMethod完成时。方法f()生成一个线程,当它完成时,它将随时调用您的侦听器。换句话说,b.aMethod()或fb.f()旁边的代码不会等待线程完成,但您有一个组件(侦听器),它在f()完成时被调用,并将结果传递给它。