如何在java中创建对象的线程返回arraylist?

如何在java中创建对象的线程返回arraylist?,java,multithreading,arraylist,Java,Multithreading,Arraylist,我想要一个线程返回列表。我不能使用run方法,因为它的返回类型是void。我在一个类中的一个单独的私有方法中使用线程,线程的调用方方法也在该类下。调用者需要来自线程结果的列表来执行一些操作。这是我的线。请帮助我了解如何从这个线程返回列表 private List<myObject> fetchmyObjList(final String abc){ new Thread(new Runnable() { @Override

我想要一个线程返回列表。我不能使用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();



    }
私有列表fetchmyObjList(最终字符串abc){
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
List myObjList=另一种内部方法(abc);
}捕获(例外e){
系统输出打印ln(e);
}
}
}).start();
}
如何使此线程将myObjList返回给调用方??请帮助。

您需要的不是可运行的

下面是如何使用callable:

您需要的,而不是Runnable


下面是一个如何使用callable:

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

List<myObject> myObjList = anotherInternalMethod(abc);
setFetchedObjects(myObjList);
List myObjList=anotherInternalMethod(abc);
SetFetchedObject(myObjList);
当您将控件放置到新创建的线程时,这是一个场景。我们可以称之为SimpliviedObserver模式——当数据可用时,外部对象通过方法调用得到通知。但是记住这个场景中的线程安全

其他场景是使用
Callable
并使用线程/执行器服务来启动任务。然后(在外部对象的控制中)可以使用Callable
.get()
来获得结果。 您可以使用阻塞或非阻塞方法等待结果,或者检查结果是否准备好从后台任务接收

当然,在您的场景中,创建一个可调用的线程只是为了阻止原始线程并等待任务完成从方法返回您的对象,这并没有什么好处——最好根本不使用线程。
如果要执行后台操作,请将方法签名更改为返回null,并在数据准备就绪时调用“侦听器”方法,或在pararell中完成其他一些操作后返回可调用的
并从中检索数据。

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

List<myObject> myObjList = anotherInternalMethod(abc);
setFetchedObjects(myObjList);
List myObjList=anotherInternalMethod(abc);
SetFetchedObject(myObjList);
当您将控件放置到新创建的线程时,这是一个场景。我们可以称之为SimpliviedObserver模式——当数据可用时,外部对象通过方法调用得到通知。但是记住这个场景中的线程安全

其他场景是使用
Callable
并使用线程/执行器服务来启动任务。然后(在外部对象的控制中)可以使用Callable
.get()
来获得结果。 您可以使用阻塞或非阻塞方法等待结果,或者检查结果是否准备好从后台任务接收

当然,在您的场景中,创建一个可调用的线程只是为了阻止原始线程并等待任务完成从方法返回您的对象,这并没有什么好处——最好根本不使用线程。
如果要执行后台操作,请将方法签名更改为返回null,并在数据准备就绪时调用“侦听器”方法,或返回可调用的
方法,并在pararell中完成一些其他操作后从中检索数据。

使用可调用而不是可运行的方法。该函数能够以期货的形式返回值。您可以利用它来实现自己的目的。

使用callable而不是Runnable。该函数能够以期货的形式返回值。您可以利用它来实现自己的目的。

这可以通过可调用接口(而不是Runnable)来解决,并使用未来的对象检索值,这还允许您等待值计算完成。您可以通过ExecutorService实现这一点。

这可以通过可调用接口(而不是Runnable)来解决,并使用未来的对象检索值,这还允许您等待值计算完成。您可以通过ExecutorService来实现这一点。

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

你可以这样做(但不要!)

private void fetchmyObjList(最终字符串abc,最终列表[]retList){
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
retList=另一种内部方法(abc);
}捕获(例外e){
系统输出打印ln(e);
}
}
}).start();
}

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

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

你可以这样做(但不要!)

private void fetchmyObjList(最终字符串abc,最终列表[]retList){
新线程(newrunnable()){
@凌驾
公开募捐{
试一试{
retList=另一种内部方法(abc);
}捕获(例外e){
系统输出打印ln(e);
}
}
}).start();
}
但是传递的retList对象(一个单元素数组)将无法正确设置,直到