【问题标题】:How to make a thread return arraylist of objects in java?如何使线程返回java中的对象数组列表?
【发布时间】:2013-10-15 05:16:49
【问题描述】:

我想要一个线程返回列表。我不能使用 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 给调用者?请帮忙。

【问题讨论】:

    标签: java multithreading arraylist


    【解决方案1】:

    您需要Callable 而不是 Runnable。

    这是一个使用方法调用:https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 为什么返回值的名称是 Futures?
        • @CodeEnthusiastic 之所以命名 Future 是因为执行是异步的,结果将在 Future 中可用。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          你需要重新考虑你在做什么。新线程将与旧线程并行运行,并且在调用线程完成更多工作之前可能无法准备好答案。你可以让调用线程等待,但为什么不直接从主线程调用“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 对象(一个单元素数组)在未来某个不可预测的时间之前不会被正确设置。

          【讨论】:

            猜你喜欢
            • 2021-04-06
            • 2016-01-13
            • 2013-02-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-11
            • 1970-01-01
            • 2015-06-16
            相关资源
            最近更新 更多