@@ -505,33 +505,59 @@ public interface Callable<V> {
505
505
#### 4.3.2 ` execute() ` vs ` submit() `
506
506
507
507
- ` 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 ` 。
509
509
510
- 我们以 ` AbstractExecutorService ` 接口中的一个 ` submit() ` 方法为例子来看看源代码:
510
+ 这里只是为了演示使用,推荐使用 ` ThreadPoolExecutor ` 构造方法来创建线程池。
511
+
512
+ 示例1:使用 ` get() ` 方法获取返回值。
511
513
512
514
``` 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();
518
522
}
523
+ return " abc" ;
524
+ });
525
+
526
+ String s = submit. get();
527
+ System . out. println(s);
528
+ executorService. shutdown();
519
529
```
520
530
521
- 上面方法调用的 ` newTaskFor ` 方法返回了一个 ` FutureTask ` 对象。
531
+ 输出:
522
532
523
- ``` java
524
- protected < T > RunnableFuture<T > newTaskFor(Runnable runnable, T value) {
525
- return new FutureTask<T > (runnable, value);
526
- }
533
+ ```
534
+ abc
527
535
```
528
536
529
- 我们再来看看 ` execute() ` 方法:
537
+ 示例2:使用 ` get(long timeout,TimeUnit unit) ` 方法获取返回值。
530
538
531
539
``` 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();
534
547
}
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)
535
561
```
536
562
537
563
#### 4.3.3 ` shutdown() ` VS` shutdownNow() `
0 commit comments