Callable的demo和用法;

 1.如下图,thread中并没有callable的构造方法;

Callable的demo和用法;_第1张图片

 于是,看看runnable;

Callable的demo和用法;_第2张图片

runnable有两个子接口,其中有一个是时间调度的,我们不看;就看第一个;

RunnableFuture这个接口有一个子实现类FutureTask;

Callable的demo和用法;_第3张图片

FutureTask实现 RunnableFuture,而RunnableFuture又继承了Runnable,所以Thread的构造方法可以传futureTask;

这就是面向接口编程,高可扩展性;

Demo:

public class CallableDemo1 {

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

        FutureTask futureTask = new FutureTask<>(new MyThread());


        new Thread(futureTask, "aaa").start();

        //同一个任务只会执行一次,重启一个线程执行相同的task,不会进去任务
        new Thread(futureTask, "bbb").start();
        System.out.println(Thread.currentThread().getName() + "正在执行");

        //如果非要task的返回值;
        //类似自旋锁;,做完跳出循环,获得callable的值;
        while (!futureTask.isDone()) {

        }

        int i = 121;
//get是阻塞的方法,一般放在最后执行
        System.out.println("resutl:" + (i + futureTask.get()));

        new Thread();

    }
}

class MyThread implements Callable {

    @Override
    public Integer call() {
        try {
            TimeUnit.SECONDS.sleep(2);
            System.out.println("call");
//            throw  new InterruptedException();
        } catch (InterruptedException e) {
            e.printStackTrace();
//futuretask的get方法也可以接受到处理异常的 返回信息;
            return 4444;
        }

        return 555;
    }

}

 

你可能感兴趣的:(Callable的demo和用法;)