大家好,又见面了,我是你们的朋友全栈君。
futureTask用法
深入学习FutureTask 主要讲解了如何去使用futureTask来创建多线程任务,并获取任务的结果。
Callable接口:实现这个接口的类,可以在这个类中定义需要执行的方法和返回结果类型。
MyTask.java类
public class MyTask implements Callable<Object>{
private String args1;
private String args2;
//构造函数,用来向task中传递任务的参数
public MyTask(String args1,String args2) {
this.args1=args1;
this.args2=args2;
}
//任务执行的动作
@Override
public Object call() throws Exception {
for(int i=0;i<100;i++){
System.out.println(args1+args2+i);
}
return true;
}
}
FutureTask使用方法
public static void main(String[] args) {
MyTask myTask = new MyTask("11", "22");//实例化任务,传递参数
FutureTask<Object> futureTask = new FutureTask<>(myTask);//将任务放进FutureTask里
//采用thread来开启多线程,futuretask继承了Runnable,可以放在线程池中来启动执行
Thread thread = new Thread(futureTask);
thread.start();
try {
//get():获取任务执行结果,如果任务还没完成则会阻塞等待直到任务执行完成。如果任务被取消则会抛出CancellationException异常,
//如果任务执行过程发生异常则会抛出ExecutionException异常,如果阻塞等待过程中被中断则会抛出InterruptedException异常。
boolean result = (boolean) futureTask.get();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
另外一种方式来开启线程
ExecutorService executorService=Executors.newCachedThreadPool();
executorService.submit(futureTask);
executorService.shutdown();
多个任务,开启多线程去执行,并依次获取返回的执行结果
public static void main(String[] args) {
//创建一个FutureTask list来放置所有的任务
List<FutureTask<Object>> futureTasks=new ArrayList<>();
for(Integer i=0;i<10;i++){
MyTask myTask=new MyTask(i.toString(), i.toString());
futureTasks.add(new FutureTask<>(myTask));
}
//创建线程池后,依次的提交任务,执行
ExecutorService executorService=Executors.newCachedThreadPool();
for(FutureTask<Object> futureTask:futureTasks){
executorService.submit(futureTask);
}
executorService.shutdown();
//根据任务数,依次的去获取任务返回的结果,这里获取结果时会依次返回,若前一个没返回,则会等待,阻塞
for(Integer i=0;i<10;i++){
try {
String flag=(String)futureTasks.get(i).get();
System.out.println(flag);
} catch (Exception e) {
e.printStackTrace();
}
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149416.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...