通过实现Callable接口实现多线程。
环境:IntelliJ IDEA、JDK1.8

步骤

  1. 自定义类,实现Callable接口,需要返回值(call方法)
  2. 实现call()方法,编写线程执行体(可以抛出异常)
  3. 创建目标对象,假设为t1
  4. 创建执行服务ExecutorService ser = Executors.newFixedThreadPool(int 线程个数);
  5. 提交执行结果Future<t1返回值类型> result1 = ser.submit(目标对象t1);(t1返回值类型在前边定义类时定义)
  6. 获取结果t1返回值类型 r1 = result1.get(); (可以抛出异常)
  7. 关闭服务ser.shutdownNow();

代码演示

步骤一

自定义类,实现Callable接口,需要返回值(call方法)。

步骤二

实现call()方法,编写线程执行体(可以抛出异常)

对Thread类中的扩展进行修改,修改成实现Callable接口的方式。类命名为webDownloader2。因为实现Callable接口可以定义返回值,所以这里把downloader方法和run方法合并为call()方法。把System.out.printf()改成return

class webDownloader2 implements Callable {private String url;//网络资源URLprivate String local;//下载的文件,保存路径private String name;//下载到本地后的文件名public webDownloader2(String url,String local,String name){this.url = url;this.name = name;this.local = local;}public webDownloader2(String url,String local){this.local = local;this.url = url;this.name = url.substring(url.lastIndexOf("/")+1);//若不指定文件名,则根据url进行命名,包括后缀一共不得超过20个字符this.name = this.name.length()>20?this.name.substring(this.name.length()-20):this.name;}@Overridepublic String call() {//线程String localName = this.local+this.name;try {File file = new File(localName);while (file.exists()){//判断是否有重名的文件StringBuffer newName = new StringBuffer(this.name);newName.insert(newName.lastIndexOf("."),"0");//文件名后边加个0this.name = newName.toString();//更新文件名this.name = this.name.length()>20?this.name.substring(this.name.length()-20):this.name;localName=this.local + this.name;//更新下载路径(包括文件名)localNamefile = new File(localName);//更新file,下一次循环重新判断是否存在重名的文件}FileUtils.copyURLToFile(new URL(this.url),new File(localName));//调用Commons io包的类,进行文件下载return "\n文件下载成功!保存路径为:"+localName;} catch (IOException e) {e.printStackTrace();return "\n文件下载失败!!!";}}
}

步骤三

创建目标对象。下边的t1-t4。

编写测试类:

public class TestCallable {public static void main(String[] args) {String url1 = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599476670887&di=c6b212a71544515388465aa47ad81dd6&imgtype=0&src=http%3A%2F%2Fimg.mp.sohu.com%2Fq_70%2Cc_zoom%2Cw_640%2Fupload%2F20170801%2F78c2a43c2204429dbe7b864f71658f88_th.jpg";String url2 = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599476817781&di=b5c0bb5b838466f59a47c87a67727168&imgtype=0&src=http%3A%2F%2Fattachments.gfan.com%2Fforum%2Fattachments2%2F201311%2F07%2F1336364xq9592q8kpx498q.jpg";String url3 = "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=176574130,4070812636&fm=26&gp=0.jpg";String url4 = "https://mirrors.tuna.tsinghua.edu.cn/apache//commons/io/binaries/commons-io-2.8.0-bin.tar.gz";String local = "/Users/qingshuaidebaoluo/Desktop/";webDownloader2 t1 = new webDownloader2(url1,local);webDownloader2 t2 = new webDownloader2(url2,local);webDownloader2 t3 = new webDownloader2(url3,local,"小黄人.jpg");webDownloader2 t4 = new webDownloader2(url4,local,"commons-io-2.8.0-bin.tar.gz");//创建执行服务ExecutorService ser = Executors.newFixedThreadPool(4);//提交执行Future<String> result1 = ser.submit(t1);Future<String> result2 = ser.submit(t2);Future<String> result3 = ser.submit(t3);Future<String> result4 = ser.submit(t4);System.out.printf("开始下载。。。\n");//获取结果try {//try-catch包裹或抛出异常System.out.println(result1.get());System.out.println(result2.get());System.out.println(result3.get());System.out.println(result4.get());} catch (Exception e) {e.printStackTrace();}//关闭服务ser.shutdownNow();}
}

下边步骤中的示例代码都是在该测试类中摘取出来的。

步骤四

创建执行服务。

 ExecutorService ser = Executors.newFixedThreadPool(4);

步骤五

提交执行结果。实现Callable接口的类webDownloader2中的call()方法的返回值类型为String。

 Future<String> result1 = ser.submit(t1);Future<String> result2 = ser.submit(t2);Future<String> result3 = ser.submit(t3);Future<String> result4 = ser.submit(t4);

步骤六

获取结果。get()方法,获取call()方法的返回值。

result1.get()

步骤七

关闭服务。

ser.shutdownNow();

测试

运行结果:

开始下载。。。文件下载成功!保存路径为:/Users/qingshuaidebaoluo/Desktop/b864f71658f88_th.jpg文件下载成功!保存路径为:/Users/qingshuaidebaoluo/Desktop/4xq9592q8kpx498q.jpg文件下载成功!保存路径为:/Users/qingshuaidebaoluo/Desktop/小黄人.jpg文件下载成功!保存路径为:/Users/qingshuaidebaoluo/Desktop/commons-io-2.8.0-bin.tar.gzProcess finished with exit code 0

学习自B站遇见狂神说
相关博客:多线程-汇总

多线程-Callable接口相关推荐

  1. 实现多线程Callable接口

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

  2. Java多线程Callable接口

    Callable和Future出现的原因 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.  这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.  如 ...

  3. 多线程——实现Callable接口

    前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...

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

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

  5. 多线程:实现Callable接口

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

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

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

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

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

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

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

  9. 第五篇、Callable接口实现多线程

    文章目录 前言 一.实现Callable接口 二.代码示例 1.Callable接口实现多线程 总结 前言 上一篇我们共同认识了并发问题,那么本篇我们将一起来学习Callable接口实现多线程. 一. ...

最新文章

  1. scrapy软连接失效和pip软连接失效
  2. 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
  3. WP7 App性能优化(8):检测应用程序性能(Ⅰ)
  4. thinkphp使用echarts_Thinkphp 与Echarts-php 使用
  5. 开源内容管理系统 php mysql_十大免费PHP+MySql平台内容管理系统推荐
  6. 5-8经典卷子神经网络结构介绍
  7. Intelj IDEA的pom.xml显示错误can not reconnect
  8. configparser模块简介
  9. python︱apple开源机器学习框架turicreate中的SFrame——新形态pd.DataFrame
  10. hbase中为何不能向表中插入数据_Python自带的数据库,用起来真方便!
  11. winform基础,主要控件简单介绍,以及小练习
  12. qW3xt.2服务器病毒
  13. java项目如何运行
  14. 机器学习的1000+篇文章总结
  15. anaconda3.6.5安装pyhive
  16. Android hardware简易流程
  17. 电脑录屏软件哪个好?高清流畅的录屏方法在这里!
  18. java + concat_Java中concat()方法和加号(+)运算符之间的区别
  19. 双摄像头另一个有什么用_手机双摄像头为什么有前后和后双两种?各有什么用?...
  20. 用python画爱心写一句话_python中用turtle画爱心表白

热门文章

  1. css 小于10像素字体
  2. C#双色球——简单抽取中奖号码
  3. RPM包安装或者安装源码包
  4. 详解PROFINET通讯协议
  5. python--破解滑动验证码
  6. 脱欧将对英国电信运营商造成什么影响?
  7. 【数据来源】如何选择合适的第三方数据源
  8. html鼠标拖动变换大小案例,js实现鼠标拖拽缩放div实例代码_哒哒_前端开发者
  9. 公司破产了股需要东承担哪些责任
  10. 本征图像分解:Retinex理论【转载】