Android 价值千万java多线程同步 <二>Callable和Future&FutureTask

1).Android 价值千万   java线程专题:Wait&notify&join&Yield

http://blog.csdn.net/whb20081815/article/details/65627387

2).Android 价值千万    java多线程同步 <二>Callable和Future&FutureTask

http://blog.csdn.net/whb20081815/article/details/65630694

3).Android 价值千万    java多线程<三>生产者消费者模型四种实现方法

http://blog.csdn.net/whb20081815/article/details/65635647

 4).Android 价值千万    java多线程同步 <四> synchronized&Lock&Atomic6种方式

http://blog.csdn.net/whb20081815/article/details/66971983

 

5).Android 价值千万java多线程同步 <五>CountDownLatch(计数器)和Semaphore(信号量)

http://blog.csdn.net/whb20081815/article/details/68498371

6).Android AsyncTask 那些你不知道的事

https://blog.csdn.net/WHB20081815/article/details/70332209

7).Android 厉害了ThreadLocal的工作原理和实例分析

https://blog.csdn.net/WHB20081815/article/details/66974651

8).Android Handle消息机制:秒懂Looper、Handler、Message三者关系

https://blog.csdn.net/WHB20081815/article/details/67639060

9).Android 性能优化<八> 多线程优化和线程管理

https://blog.csdn.net/WHB20081815/article/details/77775444

 

Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Android中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。

 

Runnable

 

其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值

public
interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

Callable

 

Callable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值,

Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值

 

 

public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

可以看到,这是一个泛型接口,call()函数返回的类型就是客户程序传递进来的V类型。

 

 

 

 

 

Future

 

Executor就是Runnable和Callable的调度容器,Future就是对于具体的Runnable或者Callable任务的执行结果进行

取消、查询是否完成、获取结果、设置结果操作

 

public interface Future<V> {

    /**
     * Attempts to cancel execution of this task.  This attempt will
     * fail if the task has already completed, has already been cancelled,
     * or could not be cancelled for some other reason. If successful,
     * and this task has not started when {@code cancel} is called,
     * this task should never run.  If the task has already started,
     * then the {@code mayInterruptIfRunning} parameter determines
     * whether the thread executing this task should be interrupted in
     * an attempt to stop the task.
     *
     * <p>After this method returns, subsequent calls to {@link #isDone} will
     * always return {@code true}.  Subsequent calls to {@link #isCancelled}
     * will always return {@code true} if this method returned {@code true}.
     *
     * @param mayInterruptIfRunning {@code true} if the thread executing this
     * task should be interrupted; otherwise, in-progress tasks are allowed
     * to complete
     * @return {@code false} if the task could not be cancelled,
     * typically because it has already completed normally;
     * {@code true} otherwise
     */
    boolean cancel(boolean mayInterruptIfRunning);

FutureTask

 

FutureTask则是一个RunnableFuture<V>,而RunnableFuture实现了Runnbale又实现了Futrue<V>这两个接口,

 

FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值

 

由于FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。

并且还可以直接通过get()函数获取执行结果,该函数会阻塞,直到结果返回。因此FutureTask既是Future、

Runnable,又是包装了Callable( 如果是Runnable最终也会被转换为Callable ), 它是这两者的合体。

 

使用的实例:AsyncTask的源码分析!

 

 

public class FutureTask<V> implements RunnableFuture<V> {
public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

 

 

 

4者关系的2中组合:

第一种组合模式:Callable,FutureTask,Future的组合

 

Callable<Integer> callable = new Callable<Integer>() {
    public Integer call() throws Exception {
        return task(20);
    }
};
FutureTask<Integer> future = new FutureTask<Integer>(callable);
new Thread(future).start();

 

第二种组合模式:ExecutorService ,Future,Callable

 

 try {
            ExecutorService mExecutor = Executors.newSingleThreadExecutor();
            FutureTask<Integer> futureTask = new FutureTask<Integer>(
                    new Callable<Integer>() {
                        @Override
                        public Integer call() throws Exception {
                            return task(20);
                        }
                    });
            // 提交futureTask
            /**FutureTask此时做为Runnable来用,Future是线程池的返回值*/
            Future <?> futureTest=mExecutor.submit(futureTask);
//            futureTest.get();
            Log.d(TAG, "future result from futureTask : "
                    + futureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }

 

 

 

实例:

 

 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    testRunnable();
    testCallable();
    testFutureTask();
    testFutureTaskThread();
}

 

 

 

 

/**
 * runnable, 无返回值
 */
public void testRunnable(){

    new Thread(new Runnable() {
        @Override
        public void run() {

            Log.d(TAG,"testRunnable"+task(20));

        }
    }).start();

}

 

 

 

 

public void testCallable(){

    try {
        /**
         * 提交runnable则没有返回值, future没有数据
         */
        ExecutorService mExecutor = Executors.newSingleThreadExecutor();
        Future<?> result = mExecutor.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                return task(20);
            }
        });
        Log.d(TAG,"future result from runnable :"+result.get());
    } catch (Exception e) {
        e.printStackTrace();
    }

}

 

 

 

 

public void testFutureTask(){

        /**
         * FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口,
         * 另外它还可以包装Runnable(实际上会转换为Callable)和Callable
         * <V>,所以一般来讲是一个符合体了,它可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行
         * ,并且还可以通过v get()返回执行结果,在线程体没有执行完成的时候,主线程一直阻塞等待,执行完则直接返回结果。
         */
        try {
            ExecutorService mExecutor = Executors.newSingleThreadExecutor();
            FutureTask<Integer> futureTask = new FutureTask<Integer>(
                    new Callable<Integer>() {
                        @Override
                        public Integer call() throws Exception {
                            return task(20);
                        }
                    });
            // 提交futureTask
            /**FutureTask此时做为Runnable来用,Future是线程池的返回值*/
            Future <?> futureTest=mExecutor.submit(futureTask);
//            futureTest.get();
            Log.d(TAG, "future result from futureTask : "
                    + futureTask.get());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

 

 

 

 

/**
 * FutureTask 和Thread的关系用法
 */
public void testFutureTaskThread(){

    Callable<Integer> callable = new Callable<Integer>() {
        public Integer call() throws Exception {
            return task(20);
        }
    };
    FutureTask<Integer> future = new FutureTask<Integer>(callable);
    new Thread(future).start();

}

 

 

 

AS源代码地址:不知道为什么传不上去

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值