Thread和runnable及callable

区别,看代码

public class Thread implements Runnable 

public interface Runnable {

      public abstract void run();

}

public interface Callable<V> {
    V call() throws Exception;
}

我要说的是,当你在线程池submit一个任务的时候发生了什么:

static final class RunnableAdapter<T> implements Callable<T> {
        final Runnable task;
        final T result;
        RunnableAdapter(Runnable task, T result) {
            this.task = task;
            this.result = result;
        }
        public T call() {
            task.run();
            return result;
        }
    }
    public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        return new RunnableAdapter<T>(task, result);
    }
    public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }
    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new FutureTask<T>(runnable, value);
    }
    public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

runnable被包装成了一个callable赋值给futuretask的callable域。其实你提交之后返回的是一个持你原来任务的future的对象,execute(ftask)就是分配线程执行任务,即调用call方法,call调用run,但是run是没有返回值的。然后当你用future.get()时候(可以设置超时),他会检查你的状态,执行完或者异常了就会返回。futuretask的run方法会调用set/setException去把结果放在outcome对象中,这俩方法都会调用finishCompletion(),它又会调用done方法,所以你可以重写done方法来做一些当任务完成时(包括异常完成)需要的操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值