`
michael.softtech
  • 浏览: 208587 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java concurrent之Runnable,Callable,Executor

阅读更多

Runnable作为线程的接口已经广为大家所知。

但是在执行任务的时候如果想要返回结果怎么办?如果想抛出异常怎么办?

这些都是Runnable无法做到的。这时候另一个线程接口就出现了: Callable:

 V call() throws Exception;

 Oh,perfect! 可以返回值,可以抛异常!

 

我们知道Runnable是通过Thread 类来执行的:new Thread(new Runnable(){..}).start();

那么Callable呢?

这个是通过RunnableFuture来执行的(当然RunnableFuture也可以用来执行Runnable)。

RunnableFuture的一个常用子类是:FutureTask.

下面的代码演示了这几个接口的用法:

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


@SuppressWarnings("unchecked")
public class TestTask {
private FutureTask<String> task=new FutureTask(new Callable(){
	public String call() throws Exception {
		return "hello";
	}
}
);
private ExecutorService exeService=Executors.newFixedThreadPool(4);
public static void main(String args[]){
	TestTask test=new TestTask();
	test.testFuture();
	test.testExecutor();
}
public void testFuture(){
	task.run();
	String result="";
	try {
		result = task.get();
	} catch (InterruptedException e) {
		e.printStackTrace();
	} catch (ExecutionException e) {
		e.printStackTrace();
	}
	System.out.println("task returns :"+result);
}
public void testExecutor(){
	exeService.execute(task);
	String result="";
	try {
		result = task.get();
	} catch (InterruptedException e) {
		e.printStackTrace();
	} catch (ExecutionException e) {
		e.printStackTrace();
	}
	System.out.println("task submmited and run:"+result);
}
}

 细心的看官可能已经发现了,这里面用到了另一个类:ExecutorService.

 这是java concurrent执行框架的一部分。

 这个框架包含了Executor(能执行Runnable),ExecutorService(Executor的子类,加强了对Runnable生命周期的管理),Executors(Executor和ExecutorService的工厂方法).在上面是通过Executors的静态方法产生一个

ThreadPoolExecutor来执行Runnable.

分享到:
评论

相关推荐

    JAVA中Callable的使用

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

    java concurrent 包 详细解析

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

    java的concurrent用法详解

    `Executor`框架是`java.util.concurrent`的核心组件之一,它为任务的执行提供了一个统一的接口。其中最重要的接口是`ExecutorService`,它定义了线程池的行为,使得我们可以将任务(`Runnable`或`Callable`对象)...

    java.util.concurrent 学习ppt

    Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...

    使用Java并发编程Concurrent Programming Using Java

    - **ExecutorService**:这是Java并发编程中最核心的接口之一,它提供了更高级的线程池管理功能。 - **Future与Callable**:`Future`代表异步计算的结果,`Callable`是一个可以返回结果的接口,常用于与`...

    java.util.concurrent.uml.pdf

    ExecutorService是Executor的一个子接口,增加了submit方法,允许提交Callable和Runnable任务,并返回一个Future对象,表示异步计算的结果。submit方法有两种形式,一种接受Runnable参数并返回一个Future,另一种...

    掌握并发的钥匙:Java Executor框架深度解析

    为了简化多线程编程,Java标准库提供了`java.util.concurrent`包,其中包含了一系列高级并发工具,而Executor框架就是其中之一。 ### Executor框架概述 Executor框架提供了一种执行异步任务的方法,它允许开发者将...

    Java的concurrent包动画演示

    1. **Executor框架**:Java `concurrent`包中最核心的概念是`Executor`框架,它将任务的提交和执行分离,简化了多线程应用的设计。`ExecutorService`是执行任务的主要接口,而`ThreadPoolExecutor`是其最常见的实现...

    javaconcurrent源码-java_concurrent:javaconcurrent包源代码学习,及相关实践示例

    ExecutorService负责接收Runnable或Callable任务并安排执行,而ThreadPoolExecutor则提供了更灵活的配置,如线程池大小、任务队列等。 2. **Future** 和 **FutureTask**: Future接口表示异步计算的结果,可以检查...

    四种方式实现线程

    `java.util.concurrent.Callable`接口与Runnable类似,但它允许线程返回一个结果。我们创建一个实现了Callable的类,然后使用`FutureTask`包装它,最后通过Thread启动。示例代码: ```java class MyCallable ...

    java thread and the concurrent utilities

    Java并发工具包`java.util.concurrent.atomic`提供了原子变量类,如`AtomicInteger`、`AtomicLong`等,这些类支持无锁编程模型,提高了并发性能。 #### 四、并发工具库 ##### 1. Executor框架 Executor框架提供了...

    Executor框架使用详解

    这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor框架的设计理念是将任务的创建与任务的执行解耦,使得系统能够更好地管理和控制并发执行...

    线程池之Executor框架.docx

    - **任务**:Executor框架处理的主要对象是任务,任务可以是实现`Runnable`接口的实例,也可以是实现`Callable`接口的实例。`Runnable`接口的任务没有返回值,而`Callable`接口的任务可以返回一个结果。 - **任务...

    java5 并发包 (concurrent)思维导图

    Java 5并发包(`java.util.concurrent`,简称`Concurrent`包)是Java平台中用于多线程编程的重要组成部分,它提供了丰富的并发工具类,极大地简化了在多线程环境下的编程工作。这个包的设计目标是提高并发性能,减少...

    Executor,Executors,ExecutorService比较.docx

    `Executor`是Java线程池的顶级接口,它只有一个方法`execute(Runnable command)`,用于执行传入的任务。`Executor`并不直接创建线程,而是通过实现它的子接口或类来完成。通常,我们不会直接使用`Executor`,而是...

    Java中Executor接口用法总结

    Java中的Executor接口是Java并发编程的核心组件之一,它位于java.util.concurrent包中,为执行异步任务提供了一种统一的框架。Executor接口定义了一个单一的方法`execute(Runnable command)`,用于提交一个Runnable...

    java面试精华14

    本文将深入探讨如何利用Java提供的`Runnable`与`Callable`接口配合`Future`或`FutureTask`来实现这一功能。 #### 一、基础知识回顾 在开始之前,我们先简要回顾一下`Runnable`和`Callable`这两个接口的基本概念: ...

    谈谈java的concurrent用法

    在Java编程中,`java.util.concurrent`(简称`concurrent`)包是处理多线程并发问题的核心工具。这个包的引入极大地简化了并发编程,特别是从JDK1.5版本开始,由Doug Lea设计的一系列并发工具类使得编写高效、安全的...

    java.util.concurrent 测试源文件

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

    java-concurrent:java 并发编程例子

    首先,`java.util.concurrent`包中的核心组件包括`Executor`、`Future`、`Callable`、`ThreadLocal`以及各种并发集合如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。这些组件设计的目标是提高多线程环境下的性能...

Global site tag (gtag.js) - Google Analytics