1、Callable源码:
package java.util.concurrent;
/**
* A task that returns a result and may throw an exception.
* Implementors define a single method with no arguments called
* call.
*
* The Callable interface is similar to {
* java.lang.Runnable}, in that both are designed for classes whose
* instances are potentially executed by another thread. A
* Runnable, however, does not return a result and cannot
* throw a checked exception.
*
* 和Runnable接口很相似
* 不同的是Runnable方法里面的run方法没有返回值,而这里的call方法有返回值
*
* The { Executors} class contains utility methods to
* convert from other common forms to Callable classes.
*
* Executors中有一些把其他形式对象转换成Callable类的方法,task是可执行任务,result是希望返回的结果
* public static <T> Callable<T> callable(Runnable task,T result)
*
* @see Executor
* @since 1.5
* @author Doug Lea
* @param <V> the result type of method call
*/
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
* 计算结果,如果无法计算则抛出异常
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
2、Callable与Runnable接口:
1)、Runnable接口定义一个可由线程完成的任务,里面有唯一一个方法:run(),不接受任何参数,也没有返回值。
2)、Callable与Runnable最大的不同就是,它里面也有一个方法:call(),也不接受任何参数,但是有返回值。如果你希望任务完成后有一个结果反馈给你的话,那这个接口就很适合你。
3、例子:
1)、Callable不能传到Thread对象中去执行,只能通过java.util.concurrent.ExecutorService类中的<T> Future<T> submit(Callable<T> task)方法去执行任务。返回值是Future对象,通过该对象的get()方法就可以得到返回值,在任务未完成之前,get()方法会一直堵塞。
-----------------------------------------------------------------------------------
/**
* Submits a value-returning task for execution and returns a Future
* representing the pending results of the task.
* 提交一个有返回值的任务去执行,并且会返回一个Future来代表这个任务的等待结果
*
* If you would like to immediately block waiting
* for a task, you can use constructions of the form
* result = exec.submit(aCallable).get();
* 如果你想立即阻塞任务的等待,可以使用以上方式 result是任务处理结果
*
* Note: The {Executors} class includes a set of methods
* that can convert some other common closure-like objects,
* for example, {java.security.PrivilegedAction} to
* {Callable} form so they can be submitted.
*
* @param task the task to submit
* 要提交的任务
* @return a Future representing pending completion of the task
* 等待的结果 Callbale是返回(可能抛出异常的任务)的结果,这个接口实现者有一个不带任何参数的call()方法
* @throws RejectedExecutionException if task cannot be scheduled
* for execution
* @throws NullPointerException if task null
*/
<T> Future<T> submit(Callable<T> task);
-----------------------------------------------------------------------------------
/**
* Waits if necessary for the computation to complete, and then
* retrieves its result.
* 如果有必要会等到计算完成,然后返回结果
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread was interrupted
* while waiting
*/
V get() throws InterruptedException, ExecutionException;
4、实现了Callable的任务类:
package com.sxit.test;
import java.util.concurrent.Callable;
public class CallableImpl implements Callable {
private int age;
public CallableImpl(int age){
this.age = age;
}
//具体逻辑在这里实现,并有一个返回值
public Object call() throws Exception {
if(age<0){
return "输入年龄有误";
}else if(age<20){
return "你好,年轻人";
}else if(age<40){
return "你好,中年人";
}else{
return "你好,老年人";
}
}
}
5、测试类:
package com.sxit.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class CallableTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
//建立一个线程池
ExecutorService exc = Executors.newFixedThreadPool(3);
//存放返回的结果
List<Future<String>> futures = new ArrayList<Future<String>>();
for(int i = -10;i<50;i+=3){
CallableImpl call = new CallableImpl(i);
//执行callable的call方法,并有返回值
Future<String> future = exc.submit(call);
futures.add(future);
}
for(Future<String> future : futures){
//这里调用get()方法会阻塞当前线程,直到得到返回结果
System.out.println(future.get());
}
}
}
6、打印信息:
输入年龄有误
输入年龄有误
输入年龄有误
输入年龄有误
你好,年轻人
你好,年轻人
你好,年轻人
你好,年轻人
你好,年轻人
你好,年轻人
你好,中年人
你好,中年人
你好,中年人
你好,中年人
你好,中年人
你好,中年人
你好,中年人
你好,老年人
你好,老年人
你好,老年人
7、小结:
1)、Callable最大的不同和作用就是有返回值
分享到:
相关推荐
大家都知道Runnable和Callable接口都可以作为其他线程执行的任务,但是Runnable接口的run方法没有返回值,而Callable接口的call方法有返回值,那么Callable接口是如何做到的呢?在此我给出一个Demo,看看通过...
Callable接口在Java中扮演着重要的角色,特别是在多线程编程中。它被设计用来创建能够返回结果并可能抛出异常的任务。下面是Callable接口的详细分析: 1. **接口概述** Callable接口是Java中标准库的一部分,位于`...
Callable接口的基本用法 2.1 创建Callable任务 2.2 提交Callable任务 2.3 获取任务执行结果 Future接口的使用 3.1 获取任务执行状态 3.2 取消任务的执行 Callable与Runnable的对比 Callable的异常处理 Callable的...
"Java Callable接口实现细节详解" Java Callable接口是 Java 中的一个重要接口,它提供了一个通用的方法来执行异步任务,并且可以获取任务的执行结果。下面将详细介绍 Java Callable 接口的实现细节。 Callable ...
基于Java Callable接口实现线程代码实例 Java Callable接口简介 Java Callable接口是Java中的一种特殊接口,用于实现线程的返回值。该接口提供了一个call()方法,该方法可以返回一个值,用于获取线程执行的结果。 ...
Java多线程之Callable接口的实现 Java中的多线程编程是指在一个程序中同时运行多个线程,以提高程序的执行效率和响应速度。在Java中,有两种方式可以实现多线程编程,即继承Thread类和实现Runnable接口。然而,在...
Java 多线程 Callable 接口实现代码示例 Java 多线程编程中,创建线程有多种方式,其中一种便是实现 Callable 接口。Callable 接口是一个函数式接口,定义了一个 call 方法,该方法可以抛出异常并返回结果。与 ...
Java Callable接口实现多线程的方式详解 Java Callable接口是Java 1.5中引入的一种多线程实现方式,用于解决传统线程创建方式的缺陷。 Callable接口和Future接口的组合使用,能够实现多线程并发执行任务,并获取...
1. **Callable接口**:`ReadLogFileCallableByYear` 类实现了Callable接口,并重写了call()方法。call()方法内部执行实际的业务逻辑,例如读取日志文件并计算点击量。 2. **Future接口**:`Future, Object>>> ...
Runnable是执行工作的独立任务,但是它不返回任何值,如果你希望任务在完成时能够返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示...
首先,Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。call()方法可以有返回值。call()方法可以...
在Java编程语言中,Callable接口是用于创建能够返回结果并可能抛出异常的线程的。与Runnable接口相比,Callable接口提供了更强大的功能,因为Runnable只能定义无返回值的任务,而Callable可以定义有返回值的任务。这...
在Java编程中,多线程是并发处理任务的关键机制,Callable接口和FutureTask类是Java提供的用于创建具有返回值的线程的重要工具。本文将详细解释Callable接口的使用、适配器模式在创建线程中的应用,以及FutureTask在...
Java是一种广泛使用的编程语言,由Sun Microsystems公司(现属于Oracle公司)在1995年首次发布。它是一种面向对象的语言,意味着它将现实世界中的事物抽象为对象,这些对象具有属性(数据)和方法(行为)。...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
计算机后端-Java-Java核心基础-第20章 多线程 18. 创建多线程的方式三:实现Callable接
MapReduce可以帮助开发者在分布式环境中有效地处理海量数据,而泛型、匿名内部类以及Runnable和Callable接口则为Java编程提供了强大的工具,使我们能够编写更加灵活、安全和高效的代码。在实际开发中,结合这些技术...
2. **Callable**: 相比Runnable,Callable接口提供了更强大的功能,它包含一个带返回值的`call()`方法。这使得Callable任务能够返回计算结果或抛出异常。例如,如果一个任务需要计算一个复杂的数学问题,Callable...
Callable接口规定的方法是call(),而Runnable规定的方法是run()。Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。call()方法可抛出异常,而run()方法是不能抛出异常的。这是Callable和Runnable接口...