如何在java中获取线程异步执行之后的结果 java中返回类型为接口怎么返回
如何在java中获取线程异步执行之后的结果
java中提供了Future
1.Future
Runnable接口执行任务是不返回任何值的,Runnable的run()方法的执行结果是void,而Future接口的call方法是有返回结果的,这是Runnable跟Future的区别之一,它们的另一个不同之处就是实现了Runnable接口的任务执行是调用ExecutorService的execute(Runnable task)方法,而实现了Future接口的任务是调用ExecutorService的submit(Future task)方法。调用Future的get()方法就能直接得到任务的返回值,该方法会一直阻塞直到任务的结果出来为止,我们可以调用Future的isDone()方法来判断该任务的结果是否准备就绪。
[java] view plain copy
import java.util.concurrent.Callable
import java.util.concurrent.ExecutionException
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.Future
public class TestFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool()
Future result1 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0
for (int i = 0 i < 10 i ) {
sum = i
}
return sum
}
})
Future result2 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0
for (int i = 10 i < 100 i ) {
sum = i
}
return sum
}
})
executor.shutdown()
System.out.println(result1.get() result2.get())
}
}
2.FutureTask类
FutureTask实现了Future接口,将一个Callable实例作为参数传给它,就能创建一个FutureTask实例,然后用ExecutorService的submit方法来执行这个实例。最后同样是用get方法获取线程执行后的结果。
[plain] view plain copy
import java.util.concurrent.Callable
import java.util.concurrent.ExecutionException
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.FutureTask
public class TestFutureTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool()
Callable task = new Callable() {
@Override
public String call() throws Exception {
return "结果"
}
}
FutureTask ft = new FutureTask(task)
executor.submit(ft)
System.out.println(ft.get())
executor.shutdown()
}
}empty
java中返回类型为接口?怎么返回?
返回类型为一个接口的方法的话,可以用接口的类型作为返回值,也可以用实现了这个接口的类作为返回类型,比如你在一个person类中定义了一个方法:public List> say(){} 那么下面调用此方法的时候可以用
List<?> list = new person().say() 或者用
ArrayList<?> arr = new person().say().
java 获取SQL查询语句返回的结果
step1:构造连接
Class.forName("com.mysql.jdbc.Driver")
Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db","root","123")
step2:构造语句
String sql = "select username,password from t_user where username=?"
PreparedStatement stmt = con.prepareStatement(sql)
stmt.setString(1, "zhangshan") //给SQL的"?"(问号)传值。
step3:执行查询
ResultSet rs = stmt.executeQuery() //rs就是SQL查询语句返回的结果集
step4:处理结果(java 获取SQL查询语句返回的结果)
List list = new ArrayList()
//遍历结果集,这样写就可以了,就是一个循环,有多少条记录,这里就会循环多少次,
//一次就是一条记录,想像一下就像一个表的一条记录
//在这里可以做查询出来的数据处理,可以封装成对象之类的(就是把值给它)
if(rs.next()) { //遍历结果集,这样写就可以了
User u = new User()
String username = rs.getString("username")
String address = rs.getString("password ")
u.setUsername(username)
u.setAddress(address)
list.add(u)
}
//上面这个例子意思是,把每一条记录封装成了一个User对象,然后这些User对象都放存入到了一个list
step4:关闭连接等
java 线程池异步任务需要处理异步结果会阻塞吗
1、关于异步:java中异步请求就是*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理