前两篇博客(多线程——继承Thread类多线程——实现Runnable接口
)介绍了java使用线程的两种方法。这篇博客继续介绍第三种方法——实现Callable接口。

先说一下Runnable和Callable的差别:

1、Callable规定的方法是call(),Runnable规定的方法是run().

2、Callable的任务运行后可返回值。而Runnable的任务是不能返回值得

3、call方法能够抛出异常,run方法不能够

4、运行Callable任务能够拿到一个Future对象,表示异步计算的结果。

它提供了检查计算是否完毕的方法。以等待计算的完毕,并检索计算的结果。通过Future对象能够了解任务运行情况,可取消任务的运行。还可获取运行结果。

还沿用前两篇博客的样例,仅仅只是这里稍作修改。如今我们不仅要输入单词的长度,并且还要求计算出字符串数组中全部单词的长度之和。

非常明显,这样一修改,多线程的运行体就须要有一个返回值,用以计算全部单词的长度之和。而runnable中的run方法是不能有返回值的,所以,这里我们仅仅能使用callable。详细代码例如以下:

package test;

import java.util.HashSet;
import java.util.Set;
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; public class Test1{
public static void main(String [] args ) {
String [] words = {"first","second","world","thread"}; //创建一个线程池
ExecutorService pool = Executors.newCachedThreadPool( );
Set<Future<Integer>> set = new HashSet<Future<Integer>>(); for (String word: words) {
Callable<Integer> callable = new testCallable(word);
Future<Integer> future = pool.submit(callable);
set.add(future);
}
int sum = 0;
for (Future<Integer> future : set) {
try {
sum += future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
System.out.println("数组中全部单词的总长度为:" + sum);
} } class testCallable implements Callable<Integer>{
private String word; public testCallable(String word){ this.word = word;
} @Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName() + ": 開始运行!" );
try {
//如果处理须要2秒
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 正在处理!" );
System.out.println(Thread.currentThread().getName() + ": " + word + "长度为:" + word.length());
return Integer.valueOf(word.length());
}
}

运行结果例如以下:

pool-1-thread-1: 開始运行。

pool-1-thread-3: 開始运行。

pool-1-thread-4: 開始运行!

pool-1-thread-2: 開始运行!

pool-1-thread-1: 正在处理!

pool-1-thread-1: first长度为:5

pool-1-thread-3: 正在处理!

pool-1-thread-3: world长度为:5

pool-1-thread-2: 正在处理!

pool-1-thread-2: second长度为:6

pool-1-thread-4: 正在处理!

pool-1-thread-4: thread长度为:6

数组中全部单词的总长度为:22

至此,java中创建线程的三种方法都以介绍完成。当然,了解了这些仅仅能说明对于多线程你刚刚入门。很多其它关于多线程的知识还有待于我们继续发掘。深入研究。

多线程——实现Callable接口的更多相关文章

  1. java 多线程:Callable接口;FutureTask类实现对象【Thread、Runnable、Callable三种方式实现多线程的区别】

    Callable接口介绍: Java5开始,Java提供了Callable接口,像是Runnable接口的增强版,Callable接口提供了一个 call()方法可以作为线执行体. call()方法比 ...

  2. [改善Java代码]异步运算考虑使用Callable接口

    多线程有两种实现方式: 一种是实现Runnable接口,另一种是继承Thread类,这两种方式都有缺点,run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也 ...

  3. 实现多线程的方式之实现Callable接口

    package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...

  4. 51、多线程创建的三种方式之实现Callable接口

    实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...

  5. 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全

    1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...

  6. 通过Callable接口实现多线程

    一.通过Callable接口实现多线程 c.实现Callable重写call方法 实现Callable和实现Runnable类似,但是功能更强大,具体表现在 a.可以在任务结束后提供一个返回值,Run ...

  7. Java 多线程实现方式三:实现 Callable 接口

    完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值. 基本套路: 1. 创建目标对象 2. 创建执 ...

  8. Java多线程带返回值的Callable接口

    Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...

  9. 使用Runnable和Callable接口实现多线程的区别

    使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...

随机推荐

  1. python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数

    上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...

  2. 初始WebApi 利用WebApi实现基础的CRUD

    微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService.它是简单,代码 ...

  3. hibernate笔记(一)

    一.主配置文件hibernate.cfg.xml 位置:放在src目录下. 主要包含信息: 一.数据库信息    数据库方言(类的全名) 及 数据库链接信息 1.      数据库方言 2.      ...

  4. LoadRunner脚本增强

    1.检查点 web_find() 和web_reg_find() 2.Block技术 如果对不同的事物进行不同次数的循环该怎么处理?默认情况下LoadRunner对所有的事物都是统一执行的,即虽然有多 ...

  5. UI_UIImageView 基本操作

    UI_UIImageView 经常用法 // 使用ImageView 通过 name 找到图片 UIImage *image = [UIImage imageNamed:@"bg_2&quo ...

  6. 如何灵活使用 ActionBar, Google 音乐ActionBar 隐藏和显示效果

    ActionBar 的历史这里就不介绍了,相信大家都清楚:在一个 app 中,如果 ActionBar 运用的好,那么将会省去大量的代码,而且整个 app 效果也相当不错,大家有兴趣可以下载 goog ...

  7. crm高速开发之QueryExpression

    /* 创建者:菜刀居士的博客  * 创建日期:2014年07月06号  */ namespace Net.CRM.OrganizationService {     using System;     ...

  8. 基于JSP+SERVLET的新闻发布系统(二)

    接下来讲解的是通过AJAX验证用户名是否已经添加 用户名: <input type="text" name="userName" id="use ...

  9. IOS7上呈现IOS6的水滴刷新效果

    IOS7上呈现IOS6的水滴刷新效果    到了IOS7 发现自带的刷新 不再是 IOS6自带的水滴效果了 你是否怀念那IOS6的效果呢? 哈哈,于是收集各方资料,整理编写一个属于自己的水滴刷新效果 ...

  10. VC动态轨迹画线

    分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...