`

concurrent: Callable用法

 
阅读更多

转载自: http://auguslee.iteye.com/blog/1292335

Callable 和 Runnable 的使用方法大同小异, 区别在于:
1.Callable 使用 call() 方法, Runnable 使用 run() 方法
2.call() 可以返回值, 而 run()方法不能返回。
3.call() 可以抛出受检查的异常,比如ClassNotFoundException, 而run()不能抛出受检查的异常。
Callable示例如下:
 
class TaskWithResult implements Callable<String> {
	private int id;

	public TaskWithResult(int id) {
		this.id = id;
	}

	@Override
	public String call() throws Exception {
		return "result of TaskWithResult " + id;
	}
}

public class CallableTest {
	public static void main(String[] args) throws InterruptedException,
			ExecutionException {
		ExecutorService exec = Executors.newCachedThreadPool();
		ArrayList<Future<String>> results = new ArrayList<Future<String>>();	//Future 相当于是用来存放Executor执行的结果的一种容器
		for (int i = 0; i < 10; i++) {
			results.add(exec.submit(new TaskWithResult(i)));
		}
		for (Future<String> fs : results) {
			if (fs.isDone()) {
				System.out.println(fs.get());
			} else {
				System.out.println("Future result is not yet complete");
			}
		}
		exec.shutdown();
	}
}

执行结果
result of TaskWithResult 0
result of TaskWithResult 1
result of TaskWithResult 2
result of TaskWithResult 3
result of TaskWithResult 4
result of TaskWithResult 5
result of TaskWithResult 6
result of TaskWithResult 7
result of TaskWithResult 8
result of TaskWithResult 9

Runnable示例:

   

  

public class LiftOff implements Runnable {

	protected int countDown = 10;
	private static int taskCount = 0;
	private final int id = taskCount++;

	public LiftOff() {

	}

	public LiftOff(int countDown) {
		this.countDown = countDown;
	}

	public String status() {
		return "#" + id + "(" + (countDown > 0 ? countDown : "LiftOff! ") + ")";
	}

	@Override
	public void run() {
		while (countDown-- > 0) {
			System.out.print(status());
			Thread.yield();
		}
		System.out.println();
	}

	public static void main(String[] args) {
		ExecutorService exec = Executors.newFixedThreadPool(1);
		for (int i = 0; i < 5; i++) {
			exec.execute(new LiftOff());
		}
		exec.shutdown();
	}
}

执行结果
#0(9)#0(8)#0(7)#0(6)#0(5)#0(4)#0(3)#0(2)#0(1)#0(LiftOff! )
#1(9)#1(8)#1(7)#1(6)#1(5)#1(4)#1(3)#1(2)#1(1)#1(LiftOff! )
#2(9)#2(8)#2(7)#2(6)#2(5)#2(4)#2(3)#2(2)#2(1)#2(LiftOff! )
#3(9)#3(8)#3(7)#3(6)#3(5)#3(4)#3(3)#3(2)#3(1)#3(LiftOff! )
#4(9)#4(8)#4(7)#4(6)#4(5)#4(4)#4(3)#4(2)#4(1)#4(LiftOff! )

注意ExecutorService 在Callable中使用的是submit(), 在Runnable中使用的是 execute()
分享到:
评论

相关推荐

    Java-Concurrent:一个使用可调用的和将来的任务实现斐波那契的简单程序

    在这个"Java-Concurrent:一个使用可调用的和将来的任务实现斐波那契的简单程序"中,我们将深入探讨如何使用Java的并发工具来解决计算密集型问题,如计算斐波那契数列。 斐波那契数列是一个经典的数学问题,它的每一...

    JAVA中Callable的使用

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

    java-concurrent:java 并发编程例子

    在`java-concurrent-master`这个项目中,你可能会看到各种示例代码,展示如何使用上述组件来解决并发问题,例如线程池的创建和使用,线程间的同步与通信,以及并发集合的实战应用等。通过这些实例,你可以更好地理解...

    concurrent:java并发编程的示例和原始代码分析

    1. **Java并发API**: 这个资源可能涵盖了Java的并发库,包括`java.util.concurrent`包中的类和接口,如`ExecutorService`, `Future`, `Callable`, `ThreadLocal`, `Semaphore`, `CyclicBarrier`, `CountDownLatch`, ...

    java-concurrent:Java并发

    Java的`wait()`、`notify()`和`notifyAll()`方法用于线程间的通信,但它们必须在同步块或同步方法中使用,以防止死锁和其他并发问题。 9. **并发设计模式** 了解如生产者消费者模型、读者写者模式、双检锁/双重...

    backport-util-concurrent(2.2 /3.1)

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

    java高并发源码-java-concurrent:Java高并发,JUC,相关源码。1、马士兵高并发视频源码(听课时练习)

    "java-concurrent"这个项目显然聚焦于Java并发编程的实践与学习,特别是通过马士兵老师的高并发视频课程的源码进行深入研究。JUC,全称Java Util Concurrency,是Java平台标准版(Java SE)的一部分,提供了丰富的...

    java并发编程艺术源码-JavaConcurrent:《Java并发编程的艺术》一书随书源码,整理版

    源码中可能包含这些方法的使用,以协调线程的执行顺序。 9. **Future和Callable**:`Future`接口表示异步计算的结果,而`Callable`接口用于定义计算任务。源码将展示如何利用这两个接口进行异步编程和获取计算结果...

    【java面试题】综合性经典Java面试题

    Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用...Callable是需要使用java.util.concurrent.ExecutorService.submit(Callable)方

    Java多线程Callable接口

    在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。 import java.util.ArrayList; import java.util....

    基于Java Callable接口实现线程代码实例

    要实现Callable接口,需要重写call()方法,该方法返回一个值。例如: ```java import java.util.concurrent.Callable; public class MyCallable implements Callable&lt;Integer&gt; { @Override public Integer call()...

    java的concurrent用法详解

    ### Java的Concurrent包用法详解 #### 一、引言 在Java 1.5之前,为了实现多线程的并发操作,开发者通常需要手动编写复杂的代码来处理线程间的同步问题,如使用`synchronized`关键字、`wait()`与`notify()`方法等。...

    java concurrent 包 详细解析

    2. **Executor框架**:`java.util.concurrent.Executor`是执行任务的核心接口,它定义了运行任务的方法。`ExecutorService`是Executor的一个子接口,提供了管理和控制执行器的额外功能,如`shutdown()`用于关闭执行...

    Callable接口源码阅读1

    Java的`java.util.concurrent.Executors`类提供了几个方法来转换其他形式的对象为Callable。例如,可以使用`Executors.callable(Runnable task, V result)`将一个Runnable转换为Callable,这样Runnable的任务就可以...

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

    通过这份中文版的`java.util.concurrent`用户指南,读者可以深入理解这些并发工具的使用方法和原理,提升在多线程环境下的编程能力。书签功能使得学习更加便捷,能够快速定位到感兴趣的章节或知识点,对Java并发编程...

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

    Java提供了两种方式实现线程同步机制,分别是使用synchronized关键字和java.util.concurrent.locks.Lock接口。 线程池的应用: 线程池技术可以应用于Web服务系统中,控制服务器系统的最大并发数与最多处理的任务数...

    java.util.concurrent 学习ppt

    Java.util.concurrent的引入是为了解决传统并发原语如wait()、notify()、synchronized和volatile的使用难度大、容易出错以及性能问题。 在并发编程中,我们经常会遇到需要管理多个线程执行任务的情况。传统的做法是...

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

    此外,移除元素也有类似的四种方法:`remove()`, `poll()`, `take()` 和 `poll(timeout, timeUnit)`。 ##### 3.3 阻塞队列实现 `BlockingQueue` 是一个接口,实际使用时需要选择具体的实现类。Java 6 中提供的实现...

    concurrent-merge-sort

    第一个是edu.ncsu.mhthakka.concurrent.callable.mergesort.CallableMergeSorter这是一个实现合并排序的类。 它使用java的Callable API。 这种方法需要太多线程,因为Future.get()方法是一个阻塞调用。 对于要在...

    使用Java并发编程Concurrent Programming Using Java

    - **Future与Callable**:`Future`代表异步计算的结果,`Callable`是一个可以返回结果的接口,常用于与`ExecutorService`结合使用。 #### 2. Concurrent集合 - **ConcurrentHashMap**:一种线程安全的哈希表实现,...

Global site tag (gtag.js) - Google Analytics