FutureTask类

FutureTask类是Future 的一个实现,并实现了Runnable, 所以可通过Executor(线程池)来执行,也可传递给Thread对象执行。
 如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时, 可以把这些作业交给Future对象在后台完成,当主线程将来需要时, 就可以通过Future对象获得后台作业的计算结果或者执行状态。 
Executor框架利用FutureTask来完成异步任务,并可以用来进行任何潜在的耗时的计算。
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

/**
 * Created with IntelliJ IDEA.
 * User: 菜鸟大明
 * Date: 14-10-23
 * Time: 下午7:02
 * To change this template use File | Settings | File Templates.
 */
public class MyCallable1 implements Callable {
    @Override
    public Object call() throws Exception {
        System.out.println("call");
        return "end";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        MyCallable1 myCallable1 = new MyCallable1();

        FutureTask fk = new MyFutureTask(myCallable1);
        // 它可以通过Thread包装来直接执行,
//        Thread thread = new Thread(fk);
//        thread.start();
        // 也可以提交给ExecuteService来执行,
//        ExecutorService exec = Executors.newCachedThreadPool();
//        Future<String> future = exec.submit(myCallable1);
        // 并且还可以通过v get()返回执行结果,
        // 在线程体没有执行完成的时候,主线程一直阻塞等待,执行完则直接返回结果。
        fk.run();
        System.out.println(fk.get());
    }
}

class MyFutureTask extends FutureTask {

    public MyFutureTask(Callable callable) {
        super(callable);
    }

    // 当线程运行结束,则运行done方法。
    @Override
    public void done() {
        // 此处一般用来计算任务运行耗时解析。
        System.out.println("done");
    }
}


package ajiayou.index0711.demo03; import java.util.Random; import java.util.concurrent.Callable; public class Match2 implements Callable<Integer> { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public Integer call() throws Exception { Random r = new Random(); //这里是随机数 int speed = r.nextInt(100); int dist = 0; for(int i = 1; i<=100; i++) { //睡眠100毫秒 Thread.sleep(30); //Thread.currentThread().getName() //获得当前线程的名称 dist += i * speed; System.out.println(this.getName() + "已前进" + (dist) + "米(" + speed + "米/秒)"); } return dist; } } /* 注释补充:创建一个线程 Java 提供了三种创建线程的方法: 1.通过继承 Thread 本身; 2.通过实现 Runnable 接口; 3.通过 Callable 和 Future 创建线程。 创建 Callable 接口的实现,并实现 call() 方法,该 call() 方法将作为线程执行体,并且有返回值。 创建 Callable 实现的实例,使用 FutureTask 来包装 Callable 对象,该 FutureTask 对象封装了该 Callable 对象的 call() 方法的返回值。 使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线程。 调用 FutureTask 对象的 get() 方法来获得子线程执行结束后的返回值。 */ package ajiayou.index0711.demo03; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class Test2 { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService es = Executors.newFixedThreadPool(3); //创建了3个线程 Match2 m = new Match2(); m.setName("java"); Match2 m1 = new Match2(); m1.setName("mysql"); Match2 m2 = new Match2(); m2.setName("boot"); //开始对上面的线程进行执行 Future<Integer> future = es.submit(m); Future<Integer> future1 = es.submit(m1); Future<Integer> future2 = es.submit(m2); Integer i = future.get(); Integer i1 = future1.get(); Integer i2 = future2.get(); System.out.println(m.getName() + "共跑了" + i + "米"); System.out.println(m1.getName() + "共跑了" + i1 + "米"); System.out.println(m2.getName() + "共跑了" + i2 + "米"); } }
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值