线程创建方式三:实现callable接口

代码示例:

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*; /**
* @Description 线程创建方式三:实现callable接口
* @Author hzx
* @Date 2022-03-26
*/
class TestCallable implements Callable<Boolean> { private String url; //网络图片地址
private String name; //保存的文件名 public TestCallable(String url, String name) {
this.url = url;
this.name = name;
} /**
* 下载图片线程的执行体
*/
@Override
public Boolean call() {
WebDownloader webDownloader = new WebDownloader();
webDownloader.downloader(url, name);
System.out.println("下载了文件:"+name);
return true;
} public static void main(String[] args) throws ExecutionException, InterruptedException {
TestCallable t1 = new TestCallable(
"https://img2022.cnblogs.com/blog/1617979/202203/1617979-20220315222236055-1081286442.png","1.jpg");
TestCallable t2 = new TestCallable(
"https://img2022.cnblogs.com/blog/1617979/202203/1617979-20220315222535845-769752621.png","2.jpg");
TestCallable t3 = new TestCallable(
"https://img2022.cnblogs.com/blog/1617979/202203/1617979-20220315222316724-2013137843.png","3.jpg"); //创建执行服务:
ExecutorService ser = Executors.newFixedThreadPool(3); //提交执行
Future<Boolean> r1 = ser.submit(t1);
Future<Boolean> r2 = ser.submit(t2);
Future<Boolean> r3 = ser.submit(t3); boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
//打印返回结果
System.out.println("rs1返回值:"+rs1);
System.out.println("rs2返回值:"+rs2);
System.out.println("rs3返回值:"+rs3); //关闭服务
ser.shutdown();
}
} //下载器
class WebDownloader {
/**
* 下载方法
*/
public void downloader(String url,String name) {
try {
FileUtils.copyURLToFile(new URL(url), new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,下载方法出现问题");
}
}
}

输出结果:

下载了文件:1.jpg
下载了文件:3.jpg
下载了文件:2.jpg
rs1返回值:true
rs2返回值:true
rs3返回值:true

callable的好处

  • 1.可以定义返回值;
  • 2.可以抛出异常。

【多线程】线程创建方式三:实现callable接口的更多相关文章

  1. 创建执行线程方式三:实现Callable接口

    Callable接口 ① Java 5.0 在 java.util.concurrent 提供了一个新的创建执行 线程的方式:Callable 接口② Callable 接口类似于 Runnable, ...

  2. Java之创建线程的方式三:实现Callable接口

    import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...

  3. 创建线程的方式三:实现Callable接口-----JDK5.0 新增

    package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...

  4. 创建线程的方式三:实现Callable接口 --- JDK 5.0新增

    /** * 创建线程的方式三:实现Callable接口. --- JDK 5.0新增 * * * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? * 1 ...

  5. Java线程的创建方式三:Callable(四)

    一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...

  6. 7. Callable 创建线程的方式三

    package com.gf.demo06; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionEx ...

  7. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  8. 牛客网Java刷题知识点之什么是进程、什么是线程、什么是多线程、多线程的好处和弊端、多线程的创建方式、JVM中的多线程解析、多线程运行图解

    不多说,直接上干货! 什么是进程? 正在进行中的程序(直译). 什么是线程? 就是进程中一个负责程序执行的控制单元(执行路径). 见 牛客网Java刷题知识点之进程和线程的区别 什么是多线程? 一个进 ...

  9. Java中的多线程的创建方式

    首先理清几个基本概念: 程序:为完成特定任务,用某种语言编写的一组指令的集合.即一段静态的代码(还没运行起来) 进程:是程序的一次执行过程,也就是说程序运行起来了,加载到了内存中,并占用了cpu的资源 ...

随机推荐

  1. mpvue打包没有app.json等配置文件的解决方法

    问题 一早上折腾了1个小时,小程序始终提示查找不到'app.json'文件.mpvue重新打包,光生成内容文件无配置文件. 解决办法 出错原因:版本问题 只需要把packpage.json里的mpvu ...

  2. python-你好

    你的程序会读入一个名字,比如John,然后输出"Hello John". 输入格式: 一行文字. 输出格式: 一行文字. 输入样例: Mary Johnson 输出样例: Hell ...

  3. js修改html中class属性

    document.getElementById("tr").setAttribute("class","styleclass"); 其中  ...

  4. 大数据学习之路之sqoop导入

    按照网上的代码导入 hadoop(十九)-Sqoop数据清洗 - 简书 (jianshu.com) ./sqoop import --connect "jdbc:mysql://192.16 ...

  5. 浅谈arguments属性callee

    1.首先 arguments 是一个对应于传递给函数的参数的类数组对象 2. arguments.callee 属性包含当前正在执行的函数. 描述 callee 是 arguments 对象的一个属性 ...

  6. 使用mockjs模拟后端返回的json数据;

    前后端分离开发中最重要的一部就是前后端联调,很多时候后端进度是跟不上前端的,所以需要前端模拟一些数据进行调试,这样前端的进度就可以加快了.后端的小哥哥别打我: 使用mockjs可以很方便的模拟出想要的 ...

  7. FreeRTOS学习记录--任务创建函数详解

    开局一张图.一步一步分析就好. (一)什么是任务? 在多任务系统中,我们按照功能不同,把整个系统分割成一个个独立的,且无法返回的函数,这个函数我们称为任务:任务包含几个属性:任务堆栈,任务函数.任务控 ...

  8. c++对c的拓展_常量引用

    常量引用:不能通过引用去修改引用所指向的内容 const int &ref =val; // const int  *const ref =&val; 注意:可引用常量 (普通引用无法 ...

  9. Spring-JdbcTemplate(注入到spring容器)-01

    1.导入spring-jdbc和spring-tx坐标 <dependency> <groupId>junit</groupId> <artifactId&g ...

  10. 如何在 Java 中实现 Dijkstra 最短路算法

    定义 最短路问题的定义为:设 \(G=(V,E)\) 为连通图,图中各边 \((v_i,v_j)\) 有权 \(l_{ij}\) (\(l_{ij}=\infty\) 表示 \(v_i,v_j\) 间 ...