多线程任务,一般用于数据量较大的场景,比如开启多个异步方法先分别去执行,最终返回数据。
例子:
(1)老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,
水买回来了放桌上,我需要的时候再去get。
(2)4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊,
FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总C,拿到最终结果
(3)高考:会做的先做,不会的放在后面做
原理:
在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,
当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,
就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,
然后会返回结果或者抛出异常。
只计算一次
get方法放到最后
编码:
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(); } }