转自:http://programmingexamples.wikidot.com/futuretask
A cancellable asynchronous computation. This class provides a base implementation of Future, with methods to start and cancel a computation, query to see if the computation is complete, and retrieve the result of the computation. The result can only be retrieved when the computation has completed; the get method will block if the computation has not yet completed. Once the computation has completed, the computation cannot be restarted or cancelled.[1]
The following example illustrates the use of the Futuretask together with the Callable.
It reverses the submitted string slowly at a rate of one char per second. In the mean time, the main thread keeps polling to see if the task is completed.
import java.util.concurrent.*;
import java.util.concurrent.ExecutorService;
public class MyStringReverser
{
ExecutorService executor = Executors.newFixedThreadPool(1);
SlowStringReverser reverser = new SlowStringReverser();
void doReverse(final String target) throws InterruptedException
{
FutureTask<String> future = new FutureTask<String>(
new Callable<String>()
{
public String call()
{
return reverser.reverseString(target);
}
});
executor.execute(future);
// try every 10 seconds
while (!future.isDone())
{
System.out.println("Task not yet completed.");
try
{
Thread.sleep(500);
} catch (InterruptedException ie)
{
System.out.println("Will check after 1/2 sec.");
}
}
try
{
System.out.println("Here is the result..." + future.get());
} catch (ExecutionException ex)
{
}
executor.shutdown();
return;
}
public static void main(String args[])
{
MyStringReverser msr = new MyStringReverser();
try
{
msr.doReverse("foobar");
} catch (Exception e)
{
e.printStackTrace();
}
}
}
class SlowStringReverser
{
StringBuffer orgString;
StringBuffer reversedString;
SlowStringReverser(String orgStr)
{
orgString = new StringBuffer(orgStr);
}
SlowStringReverser()
{
}
public String reverseString(String str)
{
orgString = new StringBuffer(str);
reversedString = new StringBuffer();
for (int i = (orgString.length() - 1); i >= 0; i--)
{
reversedString.append(orgString.charAt(i));
System.out.println("Reversing one character per second."
+ reversedString);
try
{
Thread.sleep(1000);
} catch (InterruptedException ie)
{
}
}
return reversedString.toString();
}
}
分享到:
相关推荐
在上述例子中,我们创建了一个`Callable`任务,然后用`FutureTask`包装它,并提交给`ExecutorService`执行。`get()`方法被用来获取任务的结果。 总之,`FutureTask`是Java并发编程中用于异步计算的一个强大工具,它...
下面是一个使用`ThreadPoolTaskExecutor`和`FutureTask`的例子: ```java ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) context.getBean("threadPoolTaskExecutor"); Callable<Integer> callable ...
Java并发编程中,`FutureTask`是一个非常关键的组件,它结合了`Runnable`和`Future`接口的能力,使得我们可以在异步执行的任务完成后获取其结果。`FutureTask`不仅是一个可取消的任务,还能报告其执行状态。在这个...
7. **FutureTask**:`FutureTask`实现了`Future`接口,它表示一个异步计算的结果。你可以提交一个`Callable`给`Executor`,然后使用`FutureTask`来获取计算结果。`TestFutureTask.java`可能包含了如何使用`...
本例子将深入探讨如何在Android中进行异步操作,以提升用户体验。 首先,我们要了解Android的主线程,也称为UI线程,它的主要职责是处理用户交互和更新用户界面。任何长时间运行的操作(如网络请求、数据库操作或...
在这个例子中,我们创建了一个`ExecutorService`来执行任务,然后创建了一个`FutureTask`,将`Callable`实例作为参数传入。`ExecutorService`执行`FutureTask`,`call()`方法在新线程中运行,返回一个字符串。通过...
比如在Java中,可以使用`Thread`类或`Runnable`接口来创建线程,或者使用`FutureTask`与`ExecutorService`配合进行异步操作。Python中则有`threading`模块,C++有`std::thread`库等。 此外,多线程编程需要注意线程...
本篇文章将深入探讨Java中的并发同步器,并通过具体的例子来解释如何使用`FutureTask`来实现线程之间的协作。 #### 2. FutureTask简介 `FutureTask`是Java并发编程中非常重要的一个类,它是`Future`接口的一个具体...
在这个例子中,我们将任务放入`BlockingQueue`,然后在`submitTask`方法中等待任务完成或超时。超时后,我们尝试取消任务。这提供了一种灵活的方式来管理和控制异步任务,使其具备超时取消的能力。 总的来说,通过...
5. **FutureTask**:可以与ExecutorService配合使用,返回一个Future对象,该对象可以用来获取任务的执行结果,适合在多个线程间同步。 6. **LiveData** 和 **ViewModel**(Android Architecture Components):...
然后,将Callable对象包装成一个FutureTask,FutureTask同时实现了Runnable接口,因此可以被线程执行。 2. Future的使用 示例代码中,创建了一个`FutureTask<String> cookTask`,它的构造函数接收一个Callable对象...
3. 实现Callable接口与FutureTask:Callable接口的call()方法可以返回一个结果,FutureTask可以用于获取这个结果。这种方式适合需要返回值的多线程场景。 二、线程状态与控制 Java线程有五种状态:新建、可运行、...
在网上,看到了几个比较好的代码例子,例如: a. Callable任务借助FutureTask运行: public class CallableAndFutureTask { public static void main(String[] args) { Callable<Integer> callable = new ...
在这个例子中,`MyTask`类定义了一个返回字符串的`call()`方法。 接下来,我们需要了解`FutureTask`。`FutureTask`是Java并发包(java.util.concurrent)中的一个类,它是一个可以取消的任务,同时也是一个`Future`...
在这个例子中,使用了`Executors.newFixedThreadPool(int nThreads)`来创建一个固定大小的线程池。这意味着线程池会预先创建nThreads个线程,即使它们暂时没有任务可做,也不会立即终止,而是保持待命状态。这有助于...
在这个例子中,`MyCallableTask`类实现了`Callable<String>`接口,`call()`方法会返回一个字符串。 接下来,你可以使用`FutureTask`或者`ExecutorService`来执行这个`Callable`任务: ```java import java.util....
`FutureTask`是Future和Callable的组合,可以作为ExecutorService的提交对象。 3. **线程局部变量ThreadLocal**:ThreadLocal为每个线程都提供了一个独立的变量副本,线程间的变量不会相互影响,常用于存储线程私有...
- 如时钟程序的例子所示,使用三个线程分别处理时、分、秒的显示,可以使程序更加简洁易懂。 **3. 简化异步事件的处理** - 异步处理可以避免阻塞问题,提高程序响应速度。例如,在网络服务器中,每个客户端连接都...
以下是一个使用`FutureTask`实现超时控制的例子: ```java ExecutorService executor = Executors.newSingleThreadExecutor(); FutureTask<String> future = new FutureTask(new Callable() { public String call...
下面是一个简单的例子: ```java class MyTask implements Callable<Integer> { @Override public Integer call() { // 这里执行线程任务 return result; } } ExecutorService executor = Executors....