Skip to content

Commit d257b1c

Browse files
committed
[docs fix]修复对execute() vs submit() 的�描述
1 parent e9d4a6f commit d257b1c

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

docs/java/concurrent/java线程池学习总结.md

+41-15
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)