前两篇博客(多线程——继承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. PHP - FTP上传文件类

    /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) * 时间:2006/5/9 * 作者:欣然随风 * QQ:276624915 */ class class_ftp { publi ...

  2. HDU1005(周期问题)

    Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...

  3. C语言,链表反转

    倒序思路:依次把后面的节点移往头部. struct Node{ struct Node* next; int data; }; typedef struct Node NODE; NODE* inve ...

  4. android:android:background="#00000000",透明效果

    ImageButton中设置 android:background="#00000000",可以达到透明效果 具体的源码 管理-->文件中的 viewpager0829.ra ...

  5. 【转】如何在CentOS/RHEL中安装基于Web的监控系统 linux-das

    Linux-dash是一款为Linux设计的基于Web的轻量级监控面板.这个程序会实时显示各种不同的系统属性,比如CPU负载.RAM使用率.磁盘使用率.网速.网络连接.RX/TX带宽.登录用户.运行的 ...

  6. Android 播放声音

    public static void PlayAlarmRing(Context mContext) { Uri alert = RingtoneManager.getDefaultUri(Ringt ...

  7. Convert SVG to PNG in Python - Stack Overflow

    Convert SVG to PNG in Python - Stack Overflow Convert SVG to PNG in Python

  8. 使用链表实现队列------《数据结构与算法分析-C语言描述》

    经过ubuntu的gcc验证 一.头文件 que_link.h #ifndef _QUE_LINK_H_ #define _QUE_LINK_H_ struct que_record; typedef ...

  9. 使用linq对字符串1,2,3,4,5,6,7,8,9,10求和

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SumI ...

  10. 编译kernel:编译

    韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步第10课第3节 内核启动流程分析之Makefile.WMV  1. 编译内核分三步: make xxx_defconfig [linux ...