前两篇博客(多线程——继承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;}@Overridepublic 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接口的call()方法,示例

    创建步骤,首先实现Callable接口的call()方法并指定返回值:然后创建实现类实例:FutureTask类使用Callable实现类的实例通过FutureTask的单参数构造器创建FutureT ...

  2. java 多线程callable_java 多线程-实现Callable接口

    重写的call方法可以有返回值,可以抛出异常 public class ThreadDownload implements Callable { public Boolean call() throw ...

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

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

  4. 多线程:实现Callable接口

    package com.wuming.demo02;import com.sun.org.apache.xpath.internal.operations.Bool; import org.apach ...

  5. 实现多线程Callable接口

    Callable接口,实现多线程  1.实现 Callable接口,相较于实现 Runnable 接口的方式,优点是:方法可以有返回值,并且可以抛出异常  2.需要 FutureTask实现类的支持, ...

  6. 多线程-Callable接口

    通过实现Callable接口实现多线程. 环境:IntelliJ IDEA.JDK1.8 步骤 自定义类,实现Callable接口,需要返回值(call方法) 实现call()方法,编写线程执行体(可 ...

  7. Callable 接口实现java 的多线程

    java 中创建多线程最常见的是继承Thread 的子类重写run() 方法,还有就是实现Runnable 接口 我们最好使用实现了Runnable 接口的方法原因有两点: ①因为java 的单继承的 ...

  8. JavaSE基础二十:Java 多线程(线程基础知识、Java 多线程、Java 实现多线程(继承 Thread 类、实现 Runnable 接口、实现 Callable 接口))

    本章目录 1.基础知识准备 2.Java 多线程概述 3.Java 实现多线程 3.1.继承 Thread 类 如何开启新线程 Thread 类常用方法 多线程中的同步 Thread 类同步方法 多线 ...

  9. java callable 详解_详解Java Callable接口实现多线程的方式

    在Java 1.5以前,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.无论我们以怎样的形式实现多线程,都需要调用Thread类中的start方法去向操作系统请求 ...

最新文章

  1. PBAS 背景建模源码浅析
  2. 海外投行抢滩大数据 人工智能等领域趋热
  3. 用构造函数来完成结构体的初始化
  4. 二级python 刷题就能过吗_Python 刷题笔记:这很不python,官方大大能改下吗?
  5. MybatisPlus中插入数据获取主键值
  6. hdu 5340(manacher+枚举)
  7. 关于module require的学习
  8. 会出现 unreachable statement 的可能
  9. mysql对所有id求积_sql 行列式 转换,
  10. 正版破解软件下载站大全(转载
  11. Springboot 下 ModelAndView 的简单使用
  12. 计算广告学涉及的学科与技术
  13. Informatica使用工作流程及案例1
  14. Vue2.js:v-click-outside自定义指令和vue-click-outside监听鼠标点击元素外部区域事件
  15. 应用程序-特定权限设置_在您的应用程序中管理付款:设置网站-代码
  16. Javascript代码用YC_jsRun()函数执行Javascript文件
  17. 现代计算机理论模型与工作原理
  18. Windows下mysql的下载和安装
  19. Android Fragment 真正的完全解析(上)
  20. 东软 python 培训

热门文章

  1. sql2000安装时报错的问题--实例挂起和267目录名无效
  2. 有种软件你不得不备着,那就是数据恢复类软件
  3. Java学习_day005:循环结构
  4. Visual Studio 2019更新到16.1.6
  5. SNMP系统信息获取工具onesixtyone
  6. Xamarin Android真机测试报错
  7. 渗透测试工作流程渗透测试类型法律边界
  8. Unity 4.x游戏开发技巧集锦第2章摄像机的应用
  9. python不断刷新网页_python使用多线程不断刷新网页的方法
  10. 山东财经大学python实验六答案_实验六(带答案)