当前位置:首页>开发>正文

如何在java中获取线程异步执行之后的结果 java中返回类型为接口怎么返回

2023-04-22 03:54:51 互联网 未知 开发

 如何在java中获取线程异步执行之后的结果 java中返回类型为接口怎么返回

如何在java中获取线程异步执行之后的结果

java中提供了Future接口和实现了Future接口的FutureTask 类来将线程执行之后的结果返回(通过get()方法)。
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中异步请求就是*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发出后,*被调用者*通过状态、通知来通知调用者,或通过回调函数处理

最新文章