1

我想要一个线程返回列表。我不能使用 run 方法,因为它的返回类型是 void。我在一个单独的私有方法中使用线程,该线程的调用者方法也在那里。调用者需要来自线程结果的列表来进行一些操作。这是我的线程。请帮助我了解如何从该线程返回列表。

private List<myObject> fetchmyObjList(final String abc){
        new Thread(new Runnable() {

            @Override
            public void run() {

                try {
                    List<myObject> myObjList = anotherInternalMethod(abc);
                } catch (Exception e) {
                            System.out.println(e);

                    }
                }


        }).start();



    }

我怎样才能让这个线程返回 myObjList 给调用者?请帮忙。

4

5 回答 5

6

您需要Callable而不是 Runnable。

这是一个如何使用的可调用对象:https ://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

于 2013-10-08T10:24:36.150 回答
1

使用 callable 而不是 Runnable。该函数能够以 Futures 的形式返回一个值。你可以利用它来达到你自己的目的。

于 2013-10-08T10:31:50.390 回答
0

您可以使用以下方法将数据推送到外部对象(例如具有 fetchmyObjList 的对象):

List<myObject> myObjList = anotherInternalMethod(abc);
setFetchedObjects(myObjList);

当您对新创建的线程进行控制时,这是一个场景。我们可以称之为简化的观察者模式——当数据可用时,外部对象会通过方法调用得到通知。但是请记住这个场景中的线程安全!

其他场景是使用Callable<OBJECT YOU WANT TO RETURN>和使用 Thread/ExecutorService 来启动您的任务。然后(在你的外部对象中控制)你可以使用 Callable.get()来得到你的结果。您可以使用阻塞或非阻塞方法来等待结果或检查结果是否已准备好从后台任务接收。

当然,在您的场景中,创建一个带有 Callable 的线程只是为了阻塞原始线程并等待任务完成以从方法返回您的对象,什么都没有提供 - 最好根本不使用线程。如果要执行后台操作,请将方法签名更改为返回 null + 在数据准备好时调用“侦听器”方法,或者Callable<List<myObject>>在 pararell 中完成一些其他操作后返回 a 并从中检索数据。

于 2013-10-08T10:26:44.660 回答
0

你需要重新考虑你在做什么。新线程将与旧线程并行运行,并且在调用线程完成更多工作之前可能无法准备好答案。你可以让调用线程等待,但为什么不直接从主线程调用“anotherInternalMethod”呢?

你可以做这样的事情(但不要!):

private void fetchmyObjList(final String abc, final List<myObject>[] retList)  {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                retList = anotherInternalMethod(abc);
            } catch (Exception e) {
                        System.out.println(e);
                }
            }
    }).start();
}

但是传递的 retList 对象(一个单元素数组)在未来某个不可预测的时间之前不会被正确设置。

于 2013-10-08T18:46:54.217 回答
-2

这可以通过 Callable 接口代替 Runnable 来解决,并使用 Future 对象检索值,这也可以让您等到计算出该值。您可以使用 ExecutorService 实现此目的。

于 2013-10-08T10:35:23.953 回答