public interface ExecutorService extends Executor {...}
ExecutorService#submit有三个重载方法,之前一直没注意,今天仔细以研究,还是有好些知识点的
1.第一个就不说了
<T> Future<T> submit(Callable<T> task);
2.返回的future#get会阻塞,得到的结果就是result
<T> Future<T> submit(Runnable task, T result);
3.future#get也是会阻塞的,只是返回的结果是null
Future<?> submit(Runnable task);
a.FutureTask是Future的唯一实现
public class FutureTask<V> implements RunnableFuture<V> {...}
public interface RunnableFuture<V> extends Runnable, Future<V> {...}
code demo
ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(new Runnable() { public void run() { System.out.println("run"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }); System.out.println(future.get()); final List<String> list = Lists.newArrayList("a", "b"); Future future2 = executor.submit(new Runnable() { public void run() { list.add("c"); System.out.println("run with result"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }, list); System.out.println(future2.get()); executor.shutdown();
执行结果
run null run with result [a, b, c]
相关推荐
在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为ExecutorService可以提交Runnable或Callable任务,并返回Future,从而实现对任务的异步处理和结果获取。例如: ```...
- 使用`submit(Runnable/Callable)`提交有返回值的任务,这将返回一个`Future`对象,通过它可以获取结果或管理任务状态。 例如,对于`ExecutorService es`,执行`submit()`方法时,内部会将`Runnable`或`Callable`...
Java并发编程中的ExecutorService、Callable和Future Java并发编程中,ExecutorService、Callable和Future是三大核心组件,它们之间紧密相连,共同实现了高效、安全的并发编程。下面我们将详细介绍这些组件的作用和...
总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...
Future<Integer> future = executorService.submit(new Callable() { @Override public Integer call() throws Exception { return someComputation(); } }); ``` 在上述代码中,executorService是...
Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...
`Callable`和`Future`的组合是Java并发包中一个强大的工具,它弥补了`Runnable`接口的不足,使得异步编程可以获取到返回值并处理异常。同时,`ExecutorService`作为线程池的实现,为并发编程提供了一种优雅的解决...
在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法call()而不是run()中返回的值,并且必须使用ExecutorService.submint()方法进行调用。 Callable接口规定的方法是call(),而...
`FutureTask`是`Future`的一个具体实现,它同时也是一个`Runnable`,可以直接提交给ExecutorService。`FutureTask`的构造函数接受一个Callable对象,当任务执行完成后,可以通过`FutureTask`的`get()`方法获取结果。...
在Java中,实现多线程有四种主要方法:继承Thread类、实现Runnable接口、使用ExecutorService和使用Callable与Future。下面将详细探讨这四种方式。 1. 继承Thread类 在Java中,我们可以直接继承Thread类并重写其run...
FutureTask是Future接口的一个具体实现,它同时实现了Runnable接口,因此可以提交给ExecutorService执行。FutureTask有两个构造函数,分别接受Callable和Runnable对象,以及一个可选的结果值。 下面是一个使用...
与Runnable接口不同,Callable可以有返回值,而且能够抛出异常。当我们需要在线程执行过程中获取某些计算结果时,Callable就非常适用。下面是一个简单的Callable示例: ```java public class MyTask implements ...
Runnable Callable Future ExecutorService Class Thread FutureTask FutureTask 获取线程执行结果的原理:以 ThreadPoolExecutor 为例(实现 ExecutorService 接口), 其 submit() 方法提交任务, 返回 一个 ...
Callable 接口类似 Runnable,但提供了更丰富的功能,而 Future 对象则用于管理和控制异步计算的结果。 **Callable 接口** Callable 接口与 Runnable 相比,具有以下特点: 1. **方法不同**:Callable 接口中定义了...
Callable、Future、FutureTask之间的关系 RunnableFuture是一个接口,它继承了Runnable和Future这两个接口。RunnableFuture的源码如下: public interface RunnableFuture<V> extends Runnable, Future<V> { void...
使用`submit()`方法可以将Runnable或Callable任务提交给`ExecutorService`,并返回一个`Future`对象。 在处理可能会阻塞或运行时间过长的任务时,`Future`和`ExecutorService`的组合特别有用。例如,如果你需要从...
它有两种重载形式:`Future<?> submit(Runnable task)`和`<T> Future<T> submit(Callable<T> task)`。这两种形式的主要区别在于,`Callable`任务可以有返回值,而`Runnable`任务没有。`submit()`方法会将任务提交到...
- **submit(Callable)**:提交一个`Callable`任务,同样返回`Future`对象,`Callable`的任务可以有返回值。 - **invokeAny**(Collection<Callable<T>> tasks)**:在给定的任务列表中,选择并执行一个任务,返回其...
ExecutorService是一个高级的线程池管理器,提供了多种submit()方法来提交Runnable或Callable任务。使用ExecutorService可以实现多线程执行任务,并获取执行结果。 六、Callable和Future的应用场景 Callable和...