`
Luob.
  • 浏览: 1589923 次
  • 来自: 上海
社区版块
存档分类
最新评论

JDK1.5 获取线程执行结果 Callable Future

    博客分类:
  • Java
阅读更多

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * Callable  Future  (类是有回调的 线程池任务) 可以获取 线程执行后的 结果(无序的)  
 */
public class CallableAndFuture {
	/**
	 * @param args
	 * @throws ExecutionException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException,Exception {
		ExecutorService threadPool=Executors.newSingleThreadExecutor();
		
		// 提交当个任务  然后获取等待结果 
		Future<String> future=threadPool.submit(new Callable<String>() {
			@Override
			public String call() throws Exception {
				// TODO Auto-generated method stub
				Thread.sleep(2000);
				return "Hello: "+Thread.currentThread().getName();
			}
		});
		System.out.println("等待结果中...");
		//什么时候有结果后 再获取结果
		System.out.println("结果为:"+future.get());
		
		//等待 1秒后 获取结果  没有取到结果就算了
		System.out.println("结果为:"+future.get(1, TimeUnit.SECONDS));
		threadPool.shutdown();
		
		//批量提交任务  然后 循环获取 执行后的结果 
		ExecutorService threadPool1=Executors.newFixedThreadPool(10);
		CompletionService<Integer> completionService=new ExecutorCompletionService<Integer>(threadPool1);
		for (int i = 0; i < 10; i++) {
			final int seq=i;
			completionService.submit(new Callable<Integer>() {
				@Override
				public Integer call() throws Exception {
					// TODO Auto-generated method stub
					Thread.sleep(new Random().nextInt(5000));
					return seq;
				}
				
			});
		}
		System.out.println("2等待结果中...");
		for (int i = 0; i < 10; i++) {
			System.out.println(completionService.take().get());
		}
		
		threadPool1.shutdown();
		
	}

}
分享到:
评论

相关推荐

    jdk1.5 线程并发与线程池的使用

    创建`ThreadPoolExecutor`实例后,可通过`execute()`方法提交`Runnable`任务,或通过`submit()`方法提交`Callable`任务并获取`Future`对象以获取结果。 **线程池的实现原理** 1. **线程创建**:当线程池的线程数...

    详解JDK中ExecutorService与Callable和Future对线程的支持

    ExecutorService用于管理和执行线程池中的线程,Callable用于返回某个结果,Future用于获取异步计算的结果。它们之间的紧密相连,共同实现了高效、安全的并发编程。 在实际应用中,我们可以使用ExecutorService、...

    Java多线程-JDK5.0新增线程创建方式

    - **支持返回值**:通过`call()`方法可以返回执行结果,这一点在处理复杂的业务逻辑时尤为重要。 - **异常处理机制**:不同于`Runnable`中的`run()`方法只能捕获或忽略异常,`Callable`的`call()`方法可以通过`...

    Java Threads Third Edition

    4. **Future和Callable接口**:提供了异步计算的模型,允许在不阻塞当前线程的情况下获取计算结果。 线程的同步是多线程编程中的关键问题,防止数据竞争和死锁的发生。在《Java Threads Third Edition》中,作者...

    backport-util-concurrent(2.2 /3.1)

    这些接口允许异步计算并获取结果,Callable可以返回一个结果,而Future则提供了检查任务完成状态和获取结果的方法。 5. **ScheduledExecutorService的早期实现:ScheduledThreadPool** - 对于定时任务的执行,...

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 Sync 内部类调用 Callable 接口,并维护 Callable 接口的返回对象。当使用 FutureTask.get()...

    Android多线程全新讲解.pdf

    `Callable`和`Future`接口提供了获取线程执行结果的能力,而`Future`的`get()`方法可以阻塞直到结果可用。 `Lock`接口和`Condition`类提供了比`synchronized`更细粒度的锁控制,允许更灵活的线程同步策略。`...

    Android多线程全新讲解[整理].pdf

    **Callable和Future**接口提供了一种返回结果的多线程处理方式,与`Runnable`不同,`Callable`的任务可以有返回值,`Future`用于获取任务的结果。 另外,Java 1.5还引入了一些高级同步工具,如**Semaphore**(信号...

    JDK_API_1.6

    `Thread`类用于创建和管理线程,而`java.util.concurrent`包引入了高级并发工具,如`ExecutorService`、`Future`、`Callable`等,使得多线程编程更加高效和安全。 4. **网络编程**:`java.net`包提供了网络通信功能...

    第06章 JDK8以上提高开发效率有哪些-课程版.pdf

    Future接口在Java 5中被引入,主要用于解决多线程环境下控制线程执行顺序和获取执行结果的复杂性问题。传统的多线程实现,如继承Thread类、实现Runnable接口或Callable接口,虽然能实现并发,但在处理结果获取和线程...

    java多线程.pdf

    - Future对象提供了`get()`方法,可以获取线程执行完毕后的结果。这种方式支持有返回值的多线程编程。 4. 线程状态管理: - Java线程有五种状态:新建、就绪、运行、阻塞和死亡。线程的状态可以通过Thread对象的`...

    线程面试题

    `Callable`的`call()`方法执行后会返回一个`Future`对象,可以用来获取任务的结果或取消任务。 - `Callable`接口是在JDK 1.5中引入的,相比`Runnable`接口提供了更强大的功能。 7. **CyclicBarrier和...

    JDK中文版API

    另外,还引入了并发包(java.util.concurrent),提供了一组高效的线程管理和同步工具,如ExecutorService、Future和Callable等,大大简化了多线程编程。 **JDK 1.8**是Java发展历程中的一个重要里程碑,引入了...

    子线程任务发生异常,主线程事务如何回滚

    在主线程中,我们可以使用 Future 对象来获取子线程的执行结果。如果子线程执行过程中发生异常,Future 对象将抛出异常。我们可以使用 try-catch 语句来捕获异常,并进行事务的回滚。 当子线程任务发生异常时,如何...

    jdk1.7源代码

    ExecutorService、Future、Callable接口,以及synchronized、volatile关键字的实现,都是多线程编程的重点。理解这些源码可以帮助我们编写更高效、更安全的并发代码。 5.IO流:Java的IO系统在1.7版本中已经有了丰富...

    多线程精品资源--java-study 是本人学习Java过程中记录的一些代码!从Java基础的数据类型、jdk1..zip

    9. **Future和Callable接口**:用于获取异步计算的结果,是Java并发编程的重要组成部分。 10. **JDK1.x的新特性**:根据描述中提到的“jdk1.”,这里可能是JDK1.8或更高版本,那么可以讨论Lambda表达式、Stream API...

    jdk类库详细解析再也找不到更详细的了

    7. **java.util.concurrent**:这个包提供了一套高级的并发工具,如ExecutorService、Future、Callable等,便于编写高效、安全的多线程应用。 四、网络编程 8. **java.net**:包含了Socket、ServerSocket、URL等类...

    MapReduce,泛型,匿名内部类,Runnable和Callable

    而`Callable`接口则更加强大,它有一个返回结果的`call()`方法,可以抛出受检查的异常,并且可以通过Future和ExecutorService获取其计算结果。 在Java中,`Runnable`通常用于简单的无返回值的任务,而`Callable`...

    jdk1.6中文API

    JDK 1.6在并发编程方面有显著提升,引入了`java.util.concurrent`包,提供了一组高效并发工具类,如`ExecutorService`、`Future`、`Callable`等,简化了多线程编程。此外,`java.lang.ThreadLocal`类也得到了加强,...

Global site tag (gtag.js) - Google Analytics