Runnable,Callable,Thread,Future,FutureTask关系

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的原因;
 
  
 
  
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值