`

Callable与Future的应用

阅读更多
/**
 * CallableAndFuture.java
 * cn.com.songjy.test.socket.thread
 * Function: TODO 
 *
 *   version    date      author
 * ──────────────────────────────────
 *   	1.0	 2013-8-17    songjy
 *
 * Copyright (c) 2013, TNT All Rights Reserved.
 */

package cn.com.songjy.test.socket.thread;

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;
import java.util.concurrent.TimeoutException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * ClassName:CallableAndFuture
 * Callable与Future的应用
 * @author songjy
 * @version 1.0
 * @since v1.0
 * @Date 2013-8-17 下午9:13:55
 */

public class CallableAndFuture {

	private static Log log = LogFactory.getLog(CallableAndFuture.class);

	public static void main(String[] args) {
		ExecutorService thread_pools01 = Executors.newSingleThreadExecutor();

		Future<String> future = thread_pools01.submit(new Callable<String>() {

			@Override
			public String call() throws Exception {
				Thread.sleep(5 * 1000l);
				return "hello";
			}
		});

		log.info("等待结果...");

		try {
			// log.info("得到结果:"+future.get());//一直等待执行结果
			log.info("得到结果:" + future.get(2, TimeUnit.SECONDS));// 等待2秒,2秒内若未获取到结果则终止任务
		} catch (InterruptedException e) {
			log.error(e.getMessage(), e);
		} catch (ExecutionException e) {
			log.error(e.getMessage(), e);
		} catch (TimeoutException e) {
			log.error(e.getMessage(), e);
		}

		thread_pools01.shutdown();

		ExecutorService thread_pools02 = Executors.newFixedThreadPool(10);// 固定大小线程池

		CompletionService<Integer> completion = new ExecutorCompletionService<Integer>(
				thread_pools02);

		//添加10个任务
		for (int i = 0; i < 10; i++) {
			final int seq = i;
			completion.submit(new Callable<Integer>() {

				@Override
				public Integer call() throws Exception {
					Thread.sleep(new Random().nextInt(5000));
					return seq;

				}
			});
		}
		
		//获取10个任务执行结果
		for(int i=0; i<10; i++) {
			try {
				log.info(completion.take().get());//哪个任务先执行完则打印哪个的结果
			} catch (InterruptedException e) {
				log.error(e.getMessage(), e);
			} catch (ExecutionException e) {
				log.error(e.getMessage(), e);
			}
		}
		
		thread_pools02.shutdown();
	}
}


来自:http://down.51cto.com/data/443429

	public void 线程池() throws InterruptedException, ExecutionException {

		ExecutorService threadPool = Executors.newFixedThreadPool(10);

		List<Future<Integer>> list = new ArrayList<>();

		for (int i = 0; i < 10; i++) {
			Future<Integer> future = threadPool.submit(new Callable<Integer>() {
				public Integer call() throws Exception {

					int i = new Random().nextInt(100);
					System.out.println(i);
					return i;
				}
			});

			list.add(future);
		}

		int sum = 0;

		for (Future<Integer> f : list) {
			sum += f.get();
		}
		System.out.println(sum);

	}
  • 大小: 168.7 KB
分享到:
评论

相关推荐

    Callable:Callable与Future在Web应用中的优化案例

    CallableCallable与Future在Web应用中的优化案例

    Java并发编程Callable与Future的应用实例代码

    主要介绍了Java并发编程Callable与Future的应用实例代码,具有一定借鉴价值,需要的朋友可以参考下

    concurrent-csv-parser:使用 Executor 和 Callable-Future 进行并发任务处理

    技术方案基于ExecutorService、Callable、Future等高级Java并发API。 技术栈 JDK 8 Apache Maven v.3.2 构建说明 从应用程序根目录调用以下 maven 命令: mvn clean package 检查构建日志,确保构建成功: ...

    Java中的Callable接口最全讲义

    目录: 简介 Callable接口的基本用法 2.1 创建Callable任务 2.2 提交Callable任务 2.3 获取任务执行结果 Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 ...Callable的应用场景 最佳实践与注意事项

    Future执行具有返回值的线程.txt

    大家都知道实现多线程的2种方式,今天来讲讲Future实现具有返回值的线程。应用场景:前端调用时无需等待线程结束返回,线程结束后需进行其它操作如更新状态、通知kafuka等。

    Java并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    Java 并发编程实战

    6.3.2 携带结果的任务Callable与Future 6.3.3 示例:使用Future实现页面渲染器 6.3.4 在异构任务并行化中存在的局限 6.3.5 CompletionService:Executor与BlockingQueue 6.3.6 示例:使用CompletionService实现...

    并发编程笔记20190526.docx

    4、Callable、Future和FutureTask 30 5、原子操作CAS (compare atomic swap) 32 三、显式锁和AQS 34 1、AQS定义两种资源共享方式: 34 2、深入源码 37 3、了解Condition的实现 42 4、 锁的可重入 44 第三章 并发容器...

    ConcurrentApplication

    该应用程序还需要使用 Callable 和 Future 来检索有关正在运行的线程的信息并在必要时中断它们。 这些要求旨在防止并发问题,例如死锁、饥饿和竞争条件。建筑学该应用程序具有三个组件 — Client、ServerPool 和 ...

    多线程文章目录

    了解线程的状态、常用方法以及Thread、Runnable、Callable、Future、FutureTask这些基础概念和简单应用。 Java多线程②——多线程知识梳理 有助于了解线程池相关的知识、包括线程池执行逻辑、常用方法; 以及java为...

    java7源码-scn:《疯狂Java讲义》学习

    使用Callable和Future创建线程 控制线程:join线程、后台线程、线程睡眠(sleep)、线程让步(yield)、改变线程优先级 同步代码块,同步方法synchronized 同步锁:ReentrantLock锁(具有重入性) 死锁 线程通信 线程池 2....

    Java2核心技术.part5

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...

    Java2核心技术.part3

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...

    Java2核心技术.part1

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现服务器 3.3 发送E-...

    Java2核心技术.part6

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...

    Java2核心技术.part4

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...

    Java2核心技术.part2

    1.8 Callable和Future 1.9 执行器 1.10 同步器 1.11 线程和Swing工作器 第2章 集合 2.1 集合接口 2.2 具体的集合 2.3 集合框架 2.4 算法 2.5 遗留下来的集合 第3章 网络 3.1 连接到服务器 3.2 实现...

Global site tag (gtag.js) - Google Analytics