码迷,mamicode.com
首页 > 其他好文 > 详细

Runnable,Callable,Thread,Future,FutureTask关系

时间:2015-04-17 11:27:40      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

1、Runnable和Callable的区别是:
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。


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();
}
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;
}

由代码可以清晰看出:两个接口的差别:Runnable只有一个run()函数,没有返回值;Callable一个泛型接口,call()函数返回的类型就是客户程序传递进来的V类型。
使用实例:
Runnable():
class RunThread implements Runnable
{
	@Override
	public void run()
	{
	}
}
//调用
new thread(new RunThread()).start();

Callable<T>():
class CallThread implements Callable<String>
{
	@Override
	public String call() throws Exception {
		return null;
	}	
}
//调用
ExecutorService pool = Executors.newCachedThreadPool();
Future<String> future = pool.submit(new CallThread());
String result = future.get();//注意这里要加上try_catch异常控制语句
pool.shutdown();

Future:
public interface Future<V> {/**
     * Attempts to cancel execution of this task.  This attempt will
     */boolean cancel(boolean mayInterruptIfRunning);

    /**
     * Returns <tt>true</tt> if this task was cancelled before it complete
     */boolean isCancelled();

    /**
     * Returns <tt>true</tt> if this task completed.
     */boolean isDone();

    /**
     * Waits if necessary for the computation to complete, and then
     */
    V get() throws InterruptedException, ExecutionException;

    /**
     * Waits if necessary for at most the given time for the computation
     * to complete, and then retrieves its result, if available.
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
Future表示异步计算的结果,它提供了检查计算是否完成的方法isDone(),以等待计算的完成,并检索计算的结果。Future的cancel()方法可以取消任务的执行,它有一布尔参数,参数为 true 表示立即中断任务的执行,参数为 false 表示允许正在运行的任务运行完成。Future的 get() 方法等待计算完成,获取计算结果;
FutureTask
FutureTask实现了RunnableFuture<V>接口,而RunnableFuture实现了Runnbale又实现了Futrue<V>这两个接口:
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();
}

2、Runnable与Thread区别:
class Thread implements Runnable {
     /**
     * Allocates a new {@code Thread} object. This constructor has the same
     */
    public Thread() {
        init(null, null, "Thread-" + nextThreadNum(), 0);
    }
    /**
     * Allocates a new {@code Thread} object. This constructor has the same
     */
    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

    public synchronized void start() {       
   }

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
}
1、可以看出Thread是类,Runnable是接口,而Thread实现了Runnable接口
2、实现线程的方式可以:继承Thread,也可以实现Runnbale接口(当然也可以实现Callable接口)  
3、由于继承Thread类,Java是单继承,就难以继承其他的类,这是宜使用Runnable的原因;





Runnable,Callable,Thread,Future,FutureTask关系

标签:

原文地址:http://blog.csdn.net/woliuyunyicai/article/details/45093321

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!