使用java(Threads)从方法返回值

goo*_*ain 2 java concurrency multithreading

我是线程概念的新手,我正在努力学习....

我遇到了一种情况,我有一个方法,它返回一个学生列表......以及其他方法,使用此列表来提取学生的其他详细信息,如ParentsName,他们参与的体育等(基于StudentID)..我尝试使用以下代码返回列表,似乎它不起作用:(

import java.util.ArrayList;

public class studentClass implements Runnable
{
    private volatile List<Student> studentList;

    @Override
    public void run() 
    {
        studentList = "Mysql Query which is returning StudentList(StudentID,StudentName etc)";  
    }

    public List<Student> getStudentList()
    {
        return studentList;
    }
}

public class mainClass 
{
   public static void main(String args[])
   { 
       StudentClass b = new StudentClass();
       new Thread(b).start();
       // ... 
       List<Student> list = b.getStudentList();
       for(StudentClass sc : b)
       {
           System.out.println(sc);
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

我使用此链接 - 从Thread返回值 列表为NULL.
我哪里错了...... ???

Pet*_*rey 7

您很可能不等待结果完成.

一个简单的解决方案是使用ExecutorService而不是创建自己的线程池.

http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor--

ExecutorService es = Executors.newSingleThreadExecutor();

Future<List<Student>> future = es.submit(new Callable<List<Student>>() {
     public List<Student> call() throws Exception {
          // do some work to get this list
     }
};

// do something

// wait for the result.
List<Student> list = future.get();
Run Code Online (Sandbox Code Playgroud)

这给了更多选项,例如

  • 捕获抛出的任何异常,以便您知道出了什么问题.
  • isDone(),看它是否准备好了
  • 用tiemout调用get().
  • 有一个线程池,它重用线程或有多个线程.