@@ -505,33 +505,59 @@ public interface Callable<V> {
505505#### 4.3.2 ` execute() ` vs ` submit() `
506506
507507- ` execute() ` 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功与否;
508- - ` submit() ` 方法用于提交需要返回值的任务。线程池会返回一个 ` Future ` 类型的对象,通过这个 ` Future ` 对象可以判断任务是否执行成功,并且可以通过 ` Future ` 的 ` get() ` 方法来获取返回值,` get() ` 方法会阻塞当前线程直到任务完成,而使用 ` get(long timeout,TimeUnit unit) ` 方法则会阻塞当前线程一段时间后立即返回,这时候有可能任务没有执行完 。
508+ - ` submit() ` 方法用于提交需要返回值的任务。线程池会返回一个 ` Future ` 类型的对象,通过这个 ` Future ` 对象可以判断任务是否执行成功,并且可以通过 ` Future ` 的 ` get() ` 方法来获取返回值,` get() ` 方法会阻塞当前线程直到任务完成,而使用 ` get(long timeout,TimeUnit unit) ` 方法的话,如果在 ` timeout ` 时间内任务还没有执行完,就会抛出 ` java.util.concurrent.TimeoutException ` 。
509509
510- 我们以 ` AbstractExecutorService ` 接口中的一个 ` submit() ` 方法为例子来看看源代码:
510+ 这里只是为了演示使用,推荐使用 ` ThreadPoolExecutor ` 构造方法来创建线程池。
511+
512+ 示例1:使用 ` get() ` 方法获取返回值。
511513
512514``` java
513- public Future<?> submit(Runnable task) {
514- if (task == null ) throw new NullPointerException ();
515- RunnableFuture<Void > ftask = newTaskFor(task, null );
516- execute(ftask);
517- return ftask;
515+ ExecutorService executorService = Executors . newFixedThreadPool(3 );
516+
517+ Future<String > submit = executorService. submit(() - > {
518+ try {
519+ Thread . sleep(5000L );
520+ } catch (InterruptedException e) {
521+ e. printStackTrace();
518522 }
523+ return " abc" ;
524+ });
525+
526+ String s = submit. get();
527+ System . out. println(s);
528+ executorService. shutdown();
519529```
520530
521- 上面方法调用的 ` newTaskFor ` 方法返回了一个 ` FutureTask ` 对象。
531+ 输出:
522532
523- ``` java
524- protected < T > RunnableFuture<T > newTaskFor(Runnable runnable, T value) {
525- return new FutureTask<T > (runnable, value);
526- }
533+ ```
534+ abc
527535```
528536
529- 我们再来看看 ` execute() ` 方法:
537+ 示例2:使用 ` get(long timeout,TimeUnit unit) ` 方法获取返回值。
530538
531539``` java
532- public void execute(Runnable command) {
533- ...
540+ ExecutorService executorService = Executors . newFixedThreadPool(3 );
541+
542+ Future<String > submit = executorService. submit(() - > {
543+ try {
544+ Thread . sleep(5000L );
545+ } catch (InterruptedException e) {
546+ e. printStackTrace();
534547 }
548+ return " abc" ;
549+ });
550+
551+ String s = submit. get(3 , TimeUnit . SECONDS );
552+ System . out. println(s);
553+ executorService. shutdown();
554+ ```
555+
556+ 输出:
557+
558+ ```
559+ Exception in thread "main" java.util.concurrent.TimeoutException
560+ at java.util.concurrent.FutureTask.get(FutureTask.java:205)
535561```
536562
537563#### 4.3.3 ` shutdown() ` VS` shutdownNow() `
0 commit comments