简单代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import org.project.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserDao userDao;
//使用线程池
ExecutorService threads = Executors.newFixedThreadPool(10);
@RequestMapping("/findUser")
public String selectUser(){
long time =System.currentTimeMillis();
Callable<String> v1Callable = new Callable<String>() {
@Override
public String call() throws Exception {
String v1 = userDao.getByName("ff").toString();
return v1;
}
};
Callable<String> v2Callable = new Callable<String>() {
@Override
public String call() throws Exception {
String v2 = userDao.getByName("xx").toString();
return v2;
}
};
FutureTask<String> v1FT = new FutureTask<>(v1Callable);
FutureTask<String> v2FT = new FutureTask<>(v2Callable);
/*new Thread(v1FT).start();
new Thread(v2FT).start();*/
threads.submit(v1FT);
threads.submit(v2FT);
try {
System.out.println(v1FT.get());
System.out.println(v2FT.get());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(System.currentTimeMillis()-time);
return "lawUser/index";
}
}
Callable 接口类似于 Runnable,但是 Runnable 不会返回结果,并且无法抛出返回结果的异常,而 Callable 功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值。