多线程Java让线程返回一些东西到主线程
我被什么事缠住了,似乎想不出解决办法。我有一个名为dbSelect的函数,它会创建一个线程来运行MySQL查询并获取一个ResultSet
,但是我需要我的dbSelect
来获取那个ResultSet
并返回它。以下是我所拥有的:
public class Utils {
public static void dbSelect(String query){
selectQuery = query;
Thread selectThread = new selectThreadClass();
selectThread.start();
}
}
class selectThreadClass extends Thread {
public void run(){
perform();
}
public ResultSet perform(){
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost/lob/?user=root&password=");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery(Utils.selectQuery);
return rs;
}catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e){
e.printStackTrace();
return null;
}
}
}
有谁能帮我得到它,以便dbSelect
从线程返回ResultSet
吗?谢谢
# 1 楼答案
使用Callable
# 2 楼答案
从我这边开始试试
我修改了代码,得到了使用列表保存结果集值的解决方案,但我只有一个问题 也就是说,我无法在Callable中以type(ResultSet)的形式获得结果
不知怎的,当我尝试去做时,结果集是空的 使用future get()函数检索值
结果集rs=(结果集)未来。get()
下面是一段不起作用的代码
请在下面找到适合我的解决方案,我使用了列表 保存并返回值
类SelectThreadClass:
类别UTIL:
# 3 楼答案
使用callable代替Runnable
要提交可调用类,请使用ExecuterService
# 4 楼答案
你只需要在你的线程类中有一个属性,然后获得该属性
唯一的问题是,您可能最终会从dbutil中处理连接闭包和其他内容,或者,您可以将结果集转换为任何java类,然后返回该java对象列表,而不是结果集
# 5 楼答案
run
不返回结果使用alCallable或使用共享变量并在
Utils
中轮询wait
,直到SelectThreadClass
的结果可用但是我建议使用
Callable
,因为它完全适合这个任务