仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算.
package concurrent;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* FutureTask
*
* @author user
*
*/
public class FutureTaskTest {
private final FutureTask<ProductInfo> future = new FutureTask<ProductInfo>(
new Callable<ProductInfo>() {
public ProductInfo call() throws InterruptedException {
return loadProductInfo();
}
});
public ProductInfo loadProductInfo() throws InterruptedException {
System.err.println("=====waiting========");
Thread.sleep(5000);
return new ProductInfo();
}
private final Thread thread = new Thread(future);
public void start() {
thread.start();
}
public ProductInfo get() throws InterruptedException, ExecutionException,
TimeoutException {
try{
return future.get(1, TimeUnit.SECONDS);
} catch(TimeoutException e) {
//future.cancel(true); //取消任务
System.err.println("火速返回,失败!");
return future.get(10, TimeUnit.SECONDS);
}
}
/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
* @throws TimeoutException
*/
public static void main(String[] args) throws InterruptedException,
ExecutionException, TimeoutException {
FutureTaskTest test = new FutureTaskTest();
test.start();
System.err.println("=======begin========");
System.err.println(test.get());
System.err.println("=======end========");
}
}
class ProductInfo {
public String toString() {
return "**ProductInfo**";
}
}
分享到:
相关推荐
`TestFutureTask.java`可能包含了如何使用`FutureTask`来管理和获取异步任务结果的代码。 以上这些工具类在并发编程中都有其特定的使用场景和优势。通过学习这些示例,开发者能够更好地理解和运用Java的并发工具,...
本篇文章将深入探讨Java中的并发同步器,并通过具体的例子来解释如何使用`FutureTask`来实现线程之间的协作。 #### 2. FutureTask简介 `FutureTask`是Java并发编程中非常重要的一个类,它是`Future`接口的一个具体...
为了解决多线程并发访问共享资源可能导致的问题,Java提供了多种同步机制: 1. synchronized关键字:用于方法或代码块,保证同一时间只有一个线程能执行特定代码。 2. volatile关键字:保证变量在多线程环境中的可见...
3. **同步工具类**:Java并发包`java.util.concurrent`中的工具类,如`Semaphore`(信号量)、`CyclicBarrier`(回环栅栏)、`CountDownLatch`(倒计时器)和`FutureTask`(未来任务)等,提供了更灵活的线程同步和...
Vector和SimpleDateFormat是线程安全类的例子,而java原型不是线程安全的。为了确保线程安全,常常需要使用同步机制,如synchronized关键字和各种并发工具类。 ### 并发工具类 Java提供了丰富的并发工具类,帮助...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率...通过阅读提供的"JAVA多线程编程详解-详细操作例子.doc"文档,你可以深入了解这些概念并学习如何在实际项目中应用。
总之,Java并发编程是一门深奥的学问,它涉及到线程安全、同步机制、线程池管理等多个方面。熟练掌握`java.util.concurrent`包中的工具和原理,将使你的Java多线程应用更加健壮、高效。对于`java-concurrent-master`...
Java线程编程涉及到线程同步、线程安全、死锁等问题,例如可以使用synchronized关键字、wait()、notify()和notifyAll()方法来协调线程间的协作。此外,Java还提供了一些高级并发工具,如Semaphore(信号量)、...
- **3.2.1 锁同步法**:传统上,Java使用同步块(`synchronized`)来确保对共享变量的独占访问。尽管这种方法简单易用,但在高并发场景下可能导致性能瓶颈,特别是当多个线程争用同一个锁时。 - **3.2.2 比较并交换**...
Java并发编程是Java开发中的重要概念,特别是在处理高性能和高效率的应用时不可或...在实际开发中,还要注意线程安全、同步机制(如`synchronized`关键字、`Lock`接口)、线程池等高级话题,以确保程序的正确性和性能。
- 如时钟程序的例子所示,使用三个线程分别处理时、分、秒的显示,可以使程序更加简洁易懂。 **3. 简化异步事件的处理** - 异步处理可以避免阻塞问题,提高程序响应速度。例如,在网络服务器中,每个客户端连接都...
比如在Java中,可以使用`Thread`类或`Runnable`接口来创建线程,或者使用`FutureTask`与`ExecutorService`配合进行异步操作。Python中则有`threading`模块,C++有`std::thread`库等。 此外,多线程编程需要注意线程...
- **使用Callable和FutureTask**:Callable接口允许返回结果,FutureTask是它的包装器,可以放入ExecutorService中执行。 - **使用线程池**:通过ExecutorService,如ThreadPoolExecutor,可以更高效地管理线程。 ...
Java中的线程间通信是多线程编程中的关键概念,它允许不同线程间共享数据、协调执行顺序,以实现复杂任务的同步。在Java中,有多种方式可以实现线程间的通信,以下将详细解释并举例说明这些方法。 1. **线程的join...
- **原子性**:原子性保证了操作不会被其他线程中断,比如`AtomicInteger`类中的原子操作就是例子。 - **可见性**:可见性确保了当一个线程修改了共享变量,其他线程能立刻看到修改。`volatile`关键字可以提供这种...
Future模式的灵感来源于现实生活中的场景,如本文开头提到的买午餐和牙膏的例子,通过小票作为取餐凭证,实现并行处理和同步获取结果。 1. Future模式介绍 Future模式的核心是Future接口,它提供了一种方式来获取...
- **Synchronized 关键字**:这是最基本的同步机制之一,用于保证在任何时候只有一个线程可以访问特定的方法或者代码块。 - **Semaphore、CountdownLatch**:这些类提供了一种比 `synchronized` 更加灵活的方式来...
- 使用`FutureTask`类来包装一个`Callable`对象,并将其提交到`ExecutorService`中执行。 #### 二、企业真题解析 下面是一些典型的企业面试真题及其解析: 1. **线程概述** - **题1**:解释什么是线程? - ...
Java多线程实现异步调用是提高程序效率的关键技术之一。在Java中,通过创建新线程并让它们独立运行来实现异步调用,这样可以使得主线程不被长时间阻塞,从而提高程序的响应速度。以下将详细介绍如何在Java中实现这一...
在"多线程例子"这个压缩包中,可能包含了上述各种并发工具的实例代码,通过运行和分析这些代码,我们可以深入理解它们的工作原理和使用场景,提升在并发编程方面的技能。记得在实践中注意线程安全,避免死锁、活锁和...