从Runnable和Thread的角度来看Callable,Future, FutureTask

Callable,Future—相辅相成

  • 这里在学RxJava操作符,涉及到了这俩个类,所以在此学学。
  • 这俩个类是java包里的,线程相关类。Runnable知道吧,我们记得Runnable在被Thread执行的时候都是自动执行,自动结束,并且,没有返回值。它俩就相当于是这个Runnable的增强版。可以获得线程的返回值。怎么获得?这里先简单说下,然后看一段代码大家就明白了。

  • Callable在被线程执行之后能够返回一个值,但仅仅是去返回一个值,而去拿,还是得Future去拿。也就是说,Callable去返回,Future去拿。

示例代码:


        package zj.com.other;

        import java.util.Random;
        import java.util.concurrent.Callable;
        import java.util.concurrent.FutureTask;

        public class CallableFutureTest {

        private static String TAG = "CallableFutureTest";

        public static void main(String[] args) {

            //定义callable
            Callable<String> callable = new Callable<String>() {

                //这个call就相当于runnable的run方法,注意还能抛异常哦
                public String call() throws Exception {

                    System.out.println(TAG + "____do something in background");

                    Thread.sleep(2000);// 线程处理一些事物

                    return TAG + "____" + new Random().nextInt(100);

                }
            };

            //callable和FutureTask相互关联
            FutureTask<String> future = new FutureTask<String>(callable);

            //启动线程,传入一个FutureTask
            new Thread(future).start();

            //future.get
            try {

                Thread.sleep(5000);// 可能做一些事情

                System.out.println(future.get());
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

总结一波:

  • 创建一个callable
       //定义callable
        Callable<String> callable = new Callable<String>() {

        //这个call就相当于runnable的run方法,注意还能抛异常哦
        public String call() throws Exception {

            System.out.println(TAG + "____do something in background");

            Thread.sleep(2000);// 线程处理一些事物

            return TAG + "____" + new Random().nextInt(100);

        }
    };
  • 核心关联代码:

    //callable和FutureTask相互关联
    FutureTask<String> future = new FutureTask<String>(callable);

    //启动线程,传入一个FutureTask
    new Thread(future).start();
  • Callable就像是runnable,它的call方法就像是run方法。只不过可以return,泛型是我们自己定义的。并且能够作为一个入参传递给Thread

  • 这个FutureTask就像是Future的代言人,它是Future的子类。所以在测试代码内都没看见Future的身影。

PS:还有一种方式是结合线程池使用,本文先不讨论这种场景。

Thanks

https://blog.csdn.net/ghsau/article/details/7451464

猜你喜欢

转载自blog.csdn.net/user11223344abc/article/details/80253826