目录
Future
future是接口,用future时,future作为线程池的返回值,线程池的入参为new Callable();
//定义线程池
ExecutorService executorService = Executors.newFixedThreadPool(30);
//1.用Future
List<Future<Integer>> futures = new ArrayList<Future<Integer>>();
String mainThreadName = Thread.currentThread().getName();
for(int i=0; i<10; i++){
Future<Integer> future = executorService.submit(new Callable<Integer>(){
public Integer call(){
String oldThreadName = Thread.currentThread().getName();
try{
System.out.println("oldThreadName==="+oldThreadName);
String newThreadName = mainThreadName + "===" + oldThreadName;
System.out.println("newThreadName==="+newThreadName);
Thread.currentThread().setName(newThreadName);
Thread.sleep(1 * 1000);
return 1;
}catch(Exception e){
return 1;
}finally{
// Thread.currentThread().setName(oldThreadName);
}
}
});
futures.add(future);
}
for(int j=0; j<10; j++ ){
try {
System.out.println(futures.get(j).get(25, TimeUnit.SECONDS));
}catch (Exception e){
System.out.println("超时了");
}
}
FutureTask
FutrueTask是Futrue的实现,因为实现了Runnable接口,可以被submit,
用个FutrueTask时,构造FutureTask futureTask = new FutureTask(new Callable());
exe.submit(futureTask);
futureTask.get();
List<FutureTask<Integer>> tasks = new ArrayList<FutureTask<Integer>>();
for(int i=0;i<10;i++){
final Integer num = i;
FutureTask<Integer> task = new FutureTask(new Callable<Integer>(){
public Integer call(){
return num;
}
});
executorService.submit(task);
tasks.add(task);
}
for(int j=0; j<10;j++){
try {
System.out.println(tasks.get(j).get());
}catch (Exception e){
}
}
总结:不管是future 还是 futureTask在执行executorService.submit()时都遵循Java多线程实现方式-CSDN博客 中callable的过程,自定义实现run方法,内部执行call。在submit到线程池后,将自己的run方法交由线程池执行。
本文深入探讨了Java中线程池的使用方法,包括如何通过ExecutorService创建线程池,以及如何利用Future和FutureTask来管理和获取异步任务的结果。通过具体的代码示例,展示了线程池在并发编程中的应用。

3331

被折叠的 条评论
为什么被折叠?



