从Thread返回对象

时间:2013-09-14 16:06:57

标签: java multithreading return

我想知道是否有一种从正在运行的线程返回对象的好方法。 在我的android项目中(对问题不重要)我有这个方法:

public void getFolders()
{
    Thread t = new Thread(new Runnable() 
    {
        @Override
        public void run() 
        {
            List<File> result = new ArrayList<File>();
            Files.List request = null;

            do 
            {
                try 
                {
                    request = service.files().list();
                    request.setQ("'appdata' in parents");

                    FileList files = request.execute();

                    result.addAll(files.getItems());
                    request.setPageToken(files.getNextPageToken());
                } 
                catch (IOException e) 
                {
                    System.out.println("An error occurred: " + e);
                    request.setPageToken(null);
                }
            } 
            while (request.getPageToken() != null && request.getPageToken().length() > 0);
        }   
    });

    t.start();
}

此方法从互联网上抓取一些数据并将结果存储在List<File> result中。这就是为什么我不想在UI线程中运行它。现在我想将此List返回给我的main方法。这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

public interface Callable<V>

返回结果并可能抛出异常的任务。实现者定义一个没有参数的单个方法,称为call。

Callable接口类似于Runnable,因为它们都是为其实例可能由另一个线程执行的类而设计的。但是,Runnable不返回结果,也不能抛出已检查的异常。

How to use Callable

修改 此外,您应该在android中使用AsyncTask来执行后台任务,而不是创建自己的线程。

答案 1 :(得分:1)

您应该使用Callable接口而不是Runnable接口来创建线程。 Callable界面提供了call()方法,该方法可以返回Object

因为您无法将Callable传递给要执行的线程,所以您可以使用ExecutorService来执行Callable对象。该服务接受通过Callable方法运行的submit()个对象:

  <T> Future<T> submit(Callable<T> task)

如方法定义所示,向Callable提交ExecutorService对象将返回Future对象。然后,Future的get()方法将被阻止,直到任务完成。

您可以按照此链接上的示例进行操作,并根据您的要求进行自定义:

https://blogs.oracle.com/CoreJavaTechTips/entry/get_netbeans_6