`

util.Concurrent-Callable&Future

    博客分类:
  • Java
 
阅读更多

 

多线程协作完成任务时用?如IO异步编程?

package thread.pool;

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;

/**
 * Only proceed if all tasks are completed 1. 当所有任务都执行完成后,做某事
 */
public class Concurrent_Callable {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newFixedThreadPool(3);
		
		//使用Future接收任务执行后的结果
		Future<Object> future = threadPool.submit(new MyTask("task1"));
		
		try {
			Object result = future.get();
			//pass result to another processor
			System.out.println("Result is :" + result);
		} catch (InterruptedException | ExecutionException e) {
			//判断是否特定异常发生了
			if(e.getCause() instanceof IllegalStateException) {
				System.out.println("Random().nextInt(100) % 2 == 0");
			} else {
				e.printStackTrace();
			}
		}
		
		threadPool.shutdown();
	}

}

class MyTask implements Callable {
	
	private String name;
	
	public MyTask(String name) {
		this.name = name;
	}
	
	public Object call() throws Exception {
		// doing something here ...
		Thread.sleep(2000);
		if(new Random().nextInt(100)%2==0) {
			throw new IllegalStateException();
		}
		
		// after task done,return result
		return name + " Done!";
	}
}


 

 

package thread.pool;

import java.util.Random;
import java.util.concurrent.Callable;
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.FutureTask;

/**
 * Pass task results to other processor as soon as possible or do something else
 * while tasks are executing 2. 尽快将已经完成任务的结果传递给另外的线程处理
 */
public class Concurrent_CallableCompletion {

	public static void main(String[] args) {
		//创建线程池
		ExecutorService threadPool = Executors.newFixedThreadPool(3);
		//创建ExecutorCompletionService
		ExecutorCompletionService<Object> completionService = new ExecutorCompletionService<Object>(threadPool);
		
		
		//提交若干任务到ExecutorCompletionService中
		for(int i=1;i<10;i++)
			completionService.submit(new OtherTask("task"+i));
		
		for(int i=1;i<10;i++) {
			try {
					//获取下一个完成的任务,如果没有,则阻塞
					Future<Object> future = completionService.take();
					Object result = future.get();
					
					//here: pass result to another processor
					System.out.println("Result is :" + result);
			} catch (InterruptedException | ExecutionException e) {
				//判断异常来源,进行特殊处理
				if(e.getCause() instanceof IllegalStateException) {
					System.out.println("Something bad happen! Random().nextInt(100) % 2 == 0");
				} else {
					e.printStackTrace();
				}
			}
		}
		
		threadPool.shutdown();
	}


}

class OtherTask implements Callable {
	
	private String name;
	
	public OtherTask(String name) {
		this.name = name;
	}
	
	public Object call() throws Exception {
		// doing something here ...
		Thread.sleep(2000);
		if(new Random().nextInt(100)%2==0) {
			throw new IllegalStateException();
		}
		
		// after task done,return result
		return name + " Done!";
	}
}


 

分享到:
评论

相关推荐

    backport-util-concurrent(2.2 /3.1)

    - backport-util-concurrent也实现了Future和Callable接口,尽管在Java 5中它们被引入为标准库的一部分。这些接口允许异步计算并获取结果,Callable可以返回一个结果,而Future则提供了检查任务完成状态和获取结果...

    java.util.concurrent 学习ppt

    4. **Future** 和 **Callable**:Future代表异步计算的结果,Callable接口则定义了计算任务,可以返回结果并抛出异常。 5. **CountDownLatch** 和 **CyclicBarrier**:用于同步多个线程,CountDownLatch用于一次性...

    java并发工具包 java.util.concurrent中文版pdf

    ### Java并发工具包 `java.util.concurrent` 知识点详解 #### 一、引言 随着多核处理器的普及和应用程序复杂度的增加,多线程编程成为了现代软件开发不可或缺的一部分。为了简化并发编程的复杂性,Java 5 引入了 `...

    java并发工具包 java.util.concurrent中文版-带书签版

    2. **Future和Callable**:`Callable`接口类似`Runnable`,但允许返回结果。`Future`接口表示异步计算的结果,提供检查任务是否完成、获取结果或取消任务的方法。 3. **并发集合**:Java并发工具包提供了一系列线程...

    java.util.concurrent.uml.pdf

    标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...

    concurrent-1.3.4-sources.jar

    2. **java.util.concurrent** 包:这个包是Java并发库的核心,包含了许多并发和线程池相关的类,如ExecutorService、ThreadPoolExecutor、Future和Callable等。ExecutorService是线程池的接口,通过它可以管理和控制...

    java.util.concurrent 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    java.util.concurrent介绍(重要).pdf

    总之,`java.util.concurrent` 提供的工具使得并发编程变得更加容易和高效,是 Java 并发编程的基石,无论是对于初学者还是经验丰富的开发者,理解和掌握这个包都是非常重要的。通过熟练运用这些工具,开发者可以...

    基于线程池的Java多线程应用技术.pdf

    Java提供了三种方式用于创建线程,分别是继承java.lang.Thread类、实现java.lang.Runnable接口、应用java.util.concurrent.Callable接口与java.util.concurrent.Future接口。每种方式都有其优缺,需要根据实际工程...

    简析Java中的util.concurrent.Future接口

    Java中的`util.concurrent.Future`接口是Java并发编程中一个非常重要的概念,它是异步计算结果的代表。在Java多线程环境下,`Future`接口提供了一种方式来获取由其他线程执行的异步任务的结果。它允许你在不阻塞当前...

    java多线程编程总结

    - `java.util.concurrent.Future`和`java.util.concurrent.Callable`接口用于获取异步计算的结果。 ##### 3. 锁 - `java.util.concurrent.locks`包提供了多种类型的锁,如`ReentrantLock`等。 ##### 4. 信号量 - `...

    backport-util-concurrent_java_backport_源码.zip

    其次,`Future`和`Callable`接口也是backport-util-concurrent的重要组成部分。它们允许异步计算结果并提供一种方式来获取或检查计算状态。`Future`接口提供了获取结果、取消任务和检查任务是否完成的方法。而`...

    aduna-commons-concurrent-2.5.0.jar.zip

    6. **Future和Callable接口**:与Java内置的Future和Callable接口类似,但Aduna Commons Concurrent提供了一些增强的实现,使得结果的获取和任务的取消更加灵活。 7. **线程安全的数据结构**:Aduna Commons ...

    java_util_concurrent_user_guide

    `java.util.concurrent`(JUC)包是Java标准库提供的一组强大的并发工具,它为开发者提供了丰富的类和接口,帮助简化并发编程。本用户指南将深入探讨这个包中的核心概念和主要类。 1. **线程池**: `java.util....

    JAVA中Callable的使用

    Callable接口位于`java.util.concurrent`包下,它的主要方法是`call()`,这个方法相当于Runnable的`run()`,但`call()`可以有返回值和抛出异常。当我们需要在线程中执行一个计算任务并获取结果时,Callable就非常...

    scala futures and promises

    import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ExecutorServiceCalculator ...

    Android-Java并发工具类库

    2. **Future和Callable**:`Future`接口代表一个异步计算的结果,而`Callable`接口用于表示一个带有返回值的任务。这两个接口可以与`ExecutorService`结合使用,以便在后台线程执行任务并在需要时获取结果。 3. **...

    Java_JUC_Study:java.util.concurrent代码示例学习

    2. **Future和Callable**:Callable接口允许我们创建返回值的任务,而Future则用于获取这些任务的结果。FutureTask是Future的一个具体实现,它同时实现了Runnable和Future接口,可以在单个对象中同时表示任务和结果...

    java5 thread

    - `java.util.concurrent`:包含各种高级并发工具,如`Executor`框架、`Future`接口、`BlockingQueue`等,这些工具可以简化线程池管理、异步结果获取以及线程间通信。 - `java.util.concurrent.atomic`:提供原子...

    Java concurrency线程池之Callable和Future_动力节点Java学院整理

    import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent....

Global site tag (gtag.js) - Google Analytics