先来总结一下FutureTask使用场景:
如果不想分支线程阻塞主线程,又想取得分支线程的执行结果,就用FutureTask。可用于提交加载稍后需要的数据,或是复杂的计算。
代码如下:
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; public class FutureTaskTest { private FutureTask<String> futureTask = new FutureTask<String>(new SayHelloCallable()); private void sayHello() throws Exception{ futureTask.run(); String content = futureTask.get(); System.out.println(content); } /** * @param args */ public static void main(String[] args) throws Exception{ FutureTaskTest test = new FutureTaskTest(); test.sayHello(); } } class SayHelloCallable implements Callable<String> { @Override public String call() throws Exception { TimeUnit.SECONDS.sleep(2L); return "Hello"; } }
相关推荐
当你有一个Callable任务并希望将其作为线程执行时,可以创建一个FutureTask实例,然后将这个实例传递给Executor。 下面简要说明它们之间的关系和用法: - Runnable通常用于简单的任务,不关心结果的返回。 - ...
FutureTask实现原理通过submit方法的返回值,为一个Future,实际上这个Future为FutureTask实例,通过此实例,调用get方法,可以阻塞当前线程,直到任务运行完毕,返回结果。整个调用链条如下所示:worker thread -> ...
2. 创建FutureTask实例:FutureTask是Java并发包(java.util.concurrent)中的一个类,它是一个可以被取消的任务,同时也是一个实现了Runnable接口的Future。FutureTask提供了对Callable结果的访问和管理,包括获取...
- `FutureTask(Runnable runnable, V result)`:用给定的`Runnable`实例和预期结果创建一个新的`FutureTask`。这个版本通常用于那些不返回结果的任务。 2. **主要方法**: - `void run()`:执行任务。当`Executor...
java8 源码 Java 并发多线程从简到全 ...实例,这个实例 outcome 成员变量用于存储线程的执行结果, state 成员变量用于记录线程的执行状态。 由于不知道什么时候线程执行完毕并返回结果,主线程只能主动轮询查看线程
例如,对于`ExecutorService es`,执行`submit()`方法时,内部会将`Runnable`或`Callable`包装成`RunnableFuture`实例,如`FutureTask`。`ExecutorService`执行这个`RunnableFuture`,任务完成后,结果可通过`Future...
在使用`FutureTask`时,我们通常会创建一个实例,然后将其提交给`ExecutorService`执行。例如,在给出的`FutureTaskTest`案例中,我们创建了一个`AccCallable`实例,它实现了`Callable`接口并返回两个整数的和。然后...
3. 实现Callable接口与FutureTask:Callable接口的call()方法可以返回一个结果,FutureTask可以用于获取这个结果。这种方式适合需要返回值的多线程场景。 二、线程状态与控制 Java线程有五种状态:新建、可运行、...
当创建一个代理对象时,我们需要指定一个接口列表和一个InvocationHandler实例。InvocationHandler的`invoke()`方法会在代理对象调用接口方法时被触发,我们可以在这里进行额外的操作,比如日志记录、事务管理或者在...
在示例代码中,我们首先使用Lambda表达式创建了一个Callable对象,然后将该实例包装成了一个FutureTask对象。主线程中当循环变量i等于20时,程序启动以FutureTask对象为target的线程。程序最后调用FutureTask对象的...
有以下类的实例: ThreadPool ScheduledThread CyclicBarrier BlockingQueue CountDownLatch FutureTask CompletionService Semaphore
3. 使用Callable和Future:适合需要返回结果的线程,创建Callable对象,通过FutureTask包装,再创建Thread。 以下是一个简单的Runnable接口示例: ```java class MyRunnable implements Runnable { public void ...
- **创建FutureTask**:然后,将`Callable`对象传递给`FutureTask`构造函数,从而创建一个`FutureTask`实例。 - **创建线程**:接下来,使用`FutureTask`实例创建一个新的线程。 - **执行任务**:启动线程,它会调用...
基于Java Callable接口实现线程代码实例 Java Callable接口简介 Java Callable接口是Java中的一种特殊接口,用于实现线程的返回值。该接口提供了一个call()方法,该方法可以返回一个值,用于获取线程执行的结果。 ...
- 实现`Callable`接口:适用于需要有返回结果的线程,可以抛出检查异常,通过`FutureTask`包装`Callable`并使用`ExecutorService`执行。 2. **线程的状态与生命周期** - 新建(New):线程被创建但未启动。 - 可...
在这个例子中,我们创建了一个`ExecutorService`来执行任务,然后创建了一个`FutureTask`,将`Callable`实例作为参数传入。`ExecutorService`执行`FutureTask`,`call()`方法在新线程中运行,返回一个字符串。通过...
这意味着你可以将一个`Runnable`或`Callable`实例包装成一个`FutureTask`,然后提交给线程池执行。`FutureTask`不仅提供了`Future`的所有功能,还能执行任务并管理其生命周期。 下面我们将详细探讨`FutureTask`的...
通过FutureTask包装Callable对象,可以将其转换为可由Thread执行的任务。这种方式适用于需要从线程获取返回值的情况。 在多线程操作中,通常会涉及到以下几个关键概念: - **线程同步**:当多个线程访问共享资源时...
需要通过`FutureTask`包装`Callable`,再创建`Thread`。 线程状态转换是理解多线程的关键,包括新建、就绪、运行、阻塞和终止等状态。Java提供了一些线程控制方法,如`sleep()`使线程休眠,`join()`等待线程结束,`...
- 在本例中,首先创建了一个`FutureTask`实例,并通过`executor.submit()`方法将其提交给线程池执行。 #### 四、总结 通过上述分析,我们可以看出,在Java中,使用`Callable`接口和`Future`或`FutureTask`可以...