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.
分享到:
相关推荐
Callable接口位于`java.util.concurrent`包下,它的主要方法是`call()`,这个方法相当于Runnable的`run()`,但`call()`可以有返回值和抛出异常。当我们需要在线程中执行一个计算任务并获取结果时,Callable就非常...
2. **Executor框架**:`java.util.concurrent.Executor`是执行任务的核心接口,它定义了运行任务的方法。`ExecutorService`是Executor的一个子接口,提供了管理和控制执行器的额外功能,如`shutdown()`用于关闭执行...
`Executor`框架是`java.util.concurrent`的核心组件之一,它为任务的执行提供了一个统一的接口。其中最重要的接口是`ExecutorService`,它定义了线程池的行为,使得我们可以将任务(`Runnable`或`Callable`对象)...
Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...
- **ExecutorService**:这是Java并发编程中最核心的接口之一,它提供了更高级的线程池管理功能。 - **Future与Callable**:`Future`代表异步计算的结果,`Callable`是一个可以返回结果的接口,常用于与`...
ExecutorService是Executor的一个子接口,增加了submit方法,允许提交Callable和Runnable任务,并返回一个Future对象,表示异步计算的结果。submit方法有两种形式,一种接受Runnable参数并返回一个Future,另一种...
为了简化多线程编程,Java标准库提供了`java.util.concurrent`包,其中包含了一系列高级并发工具,而Executor框架就是其中之一。 ### Executor框架概述 Executor框架提供了一种执行异步任务的方法,它允许开发者将...
Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...
1. **Executor框架**:Java `concurrent`包中最核心的概念是`Executor`框架,它将任务的提交和执行分离,简化了多线程应用的设计。`ExecutorService`是执行任务的主要接口,而`ThreadPoolExecutor`是其最常见的实现...
ExecutorService负责接收Runnable或Callable任务并安排执行,而ThreadPoolExecutor则提供了更灵活的配置,如线程池大小、任务队列等。 2. **Future** 和 **FutureTask**: Future接口表示异步计算的结果,可以检查...
`java.util.concurrent.Callable`接口与Runnable类似,但它允许线程返回一个结果。我们创建一个实现了Callable的类,然后使用`FutureTask`包装它,最后通过Thread启动。示例代码: ```java class MyCallable ...
Java并发工具包`java.util.concurrent.atomic`提供了原子变量类,如`AtomicInteger`、`AtomicLong`等,这些类支持无锁编程模型,提高了并发性能。 #### 四、并发工具库 ##### 1. Executor框架 Executor框架提供了...
这个框架是基于`java.util.concurrent`包中的接口和类构建的,旨在提供线程池服务、任务调度以及并发执行任务的能力。Executor框架的设计理念是将任务的创建与任务的执行解耦,使得系统能够更好地管理和控制并发执行...
- **任务**:Executor框架处理的主要对象是任务,任务可以是实现`Runnable`接口的实例,也可以是实现`Callable`接口的实例。`Runnable`接口的任务没有返回值,而`Callable`接口的任务可以返回一个结果。 - **任务...
Java 5并发包(`java.util.concurrent`,简称`Concurrent`包)是Java平台中用于多线程编程的重要组成部分,它提供了丰富的并发工具类,极大地简化了在多线程环境下的编程工作。这个包的设计目标是提高并发性能,减少...
`Executor`是Java线程池的顶级接口,它只有一个方法`execute(Runnable command)`,用于执行传入的任务。`Executor`并不直接创建线程,而是通过实现它的子接口或类来完成。通常,我们不会直接使用`Executor`,而是...
Java中的Executor接口是Java并发编程的核心组件之一,它位于java.util.concurrent包中,为执行异步任务提供了一种统一的框架。Executor接口定义了一个单一的方法`execute(Runnable command)`,用于提交一个Runnable...
本文将深入探讨如何利用Java提供的`Runnable`与`Callable`接口配合`Future`或`FutureTask`来实现这一功能。 #### 一、基础知识回顾 在开始之前,我们先简要回顾一下`Runnable`和`Callable`这两个接口的基本概念: ...
在Java编程中,`java.util.concurrent`(简称`concurrent`)包是处理多线程并发问题的核心工具。这个包的引入极大地简化了并发编程,特别是从JDK1.5版本开始,由Doug Lea设计的一系列并发工具类使得编写高效、安全的...
首先,`java.util.concurrent`包中的核心组件包括`Executor`、`Future`、`Callable`、`ThreadLocal`以及各种并发集合如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。这些组件设计的目标是提高多线程环境下的性能...