[英]Returning Value From a Method Using java(Threads)
我是線程概念的新手,我正在努力學習....
我遇到了一種情況,我有一個方法,它返回一個學生列表......以及其他方法,使用此列表來提取學生的其他詳細信息,如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);
}
}
}
我使用此鏈接 - 從Thread返回值列表為NULL。
我哪里錯了...... ???
您很可能不等待結果完成。
一個簡單的解決方案是使用ExecutorService而不是創建自己的線程池。
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();
這給了更多選項,例如
isDone()
查看它是否已准備就緒 在代碼示例中,如果StudentClass run方法將花費幾秒鍾,您將打印為空,因為尚未設置列表。
public class MainClass
{
public static void main(String args[]) throws Exception
{
StudentClass b = new StudentClass();
ExecutorService executorService = Executors.newFixedThreadPool(3);
Future<List<Student>> studentList = executorService.submit(b);
// When the thread completed fetching from DB, studentList will have records
while(studentList.isDone())
{
System.out.println("COoolllll" + studentList.get());
}
}
}
public class StudentClass implements Callable<List<Student>>{
private volatile List<Student> studentList;
public List<Student> getStudentList()
{
return studentList;
}
@Override
public List<Student> call() throws Exception
{
/**
* studentList will fetch from DB
*/
studentList = new ArrayList<Student>();
return studentList;
}}
我認為最好有一個學生列表的全局實例,然后調用線程填充它,並有另一個bool變量來識別線程的工作是否完成或類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.