submit写C语言怎么运行,submit提交方法(一)

除了execute方法之外,ThreadPoolExecutor 还有其他三个单提交的方法,它们的内部都是调用的execute方法。

1. Future submit(Runnable)

public Future< ? > submit(Runnable task)

task要求一个 Runnable 实现类,返回一个 Future 对象。这个 Future 对象可以用来检查 Runnable 是否已经执行完毕。该 Future 的 get 方法在任务成功完成时将会返回 null。

如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。

/**

* 位于父类AbstractExecutorService中的实现

*

* @throws RejectedExecutionException 如果任务无法安排执行

* @throws NullPointerException 如果该任务为 null

*/

public Future> submit(Runnable task) {

//首先就是task任务的null校验,如果为null直接抛出NullPointerException

if (task == null) throw new NullPointerException();

//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,返回null

RunnableFuture ftask = newTaskFor(task, null);

//调用execute方法传递ftask,RunnableFuture是Runnable的子接口,因此可以传递

execute(ftask);

return ftask;

}

/**

* 位于父类AbstractExecutorService中的实现

* 为给定可运行任务返回一个 RunnableFuture。

* 该RunnableFuture具有默认的返回值,并为底层任务提供取消操作。

*

* @param runnable 被包装的任务

* @param value 将要返回的默认值

* @param 返回值类型

* @return 为给定可运行任务返回一个 RunnableFuture。

*/

protected RunnableFuture newTaskFor(Runnable runnable, T value) {

//调用FutureTask的构造器

return new FutureTask(runnable, value);

}

后面我们再介绍FutureTask是如何对Runnable以及Callable任务进行包装的,以及FutureTask相关方法的实现。

2. Future submit(Runnable, T)

public < T > Future< T > submit(Runnable task,T result)

task要求一个 Runnable 实现类,并且需要一个给定的返回值result,将返回一个 Future 对象,这个 Future 对象除了可以用来检查 Runnable 是否已经执行完毕,还可以调用get()方法获取执行结果,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。

/**

* 位于父类AbstractExecutorService中的实现

* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture具有指定默认的返回值result,并为底层任务提供取消等操作。

* 同时调用execute执行这个RunnableFuture实例。

*

* @throws RejectedExecutionException 如果任务无法安排执行

* @throws NullPointerException 如果该任务为 null

*/

public Future submit(Runnable task, T result) {

//首先就是task任务的null校验,如果为null直接抛出NullPointerException

if (task == null) throw new NullPointerException();

//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,get返回指定值

RunnableFuture ftask = newTaskFor(task, result);

//调用execute方法传递ftask,RunnableFuture是Runnable的子接口,因此可以传递

execute(ftask);

return ftask;

}

3. Future submit(Callable< T >)

public < T > Future< T > submit(Callable< T > task)

task要求一个 Callable实现类。返回一个 Future 对象,这个 Future 对象除了可以用来检查 Runnable 是否已经执行完毕,还可以调用get()方法获取Callable中call方法的执行结果,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout,TimeUnit unit)方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完。

如果任务无法安排执行,那么可能抛出RejectedExecutionException。如果该任务为 null,那么抛出NullPointerException。

/**

* 位于父类AbstractExecutorService中的实现

* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture的返回值result就是传递的Callable的call方法的返回值,并为底层任务提供取消等操作。

* 同时调用execute执行这个RunnableFuture实例。

*

* @throws RejectedExecutionException 如果任务无法安排执行

* @throws NullPointerException 如果该任务为 null

*/

public Future submit(Callable task) {

//首先就是task任务的null校验,如果为null直接抛出NullPointerException

if (task == null) throw new NullPointerException();

//将Runnable类型的task任务包装为RunnableFuture类型的ftask任务,get返回指定值

RunnableFuture ftask = newTaskFor(task);

execute(ftask);

return ftask;

}

/**

* 为给定可运行任务返回一个 RunnableFuture。该RunnableFuture的返回值result就是传递的Callable的call方法的返回值,并为底层任务提供取消等操作。

*

* @param callable 被包装的任务

* @param Callable返回值类型

* @return 为给定可运行任务返回一个 RunnableFuture。

*/

protected RunnableFuture newTaskFor(Callable callable) {

//调用FutureTask的构造器

return new FutureTask(callable);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值