Java 多线程实现方式三:实现 Callable 接口
完整套路
java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。
基本套路:
1. 创建目标对象
2. 创建执行服务
3. 提交执行
4. 获取结果
5. 关闭服务
6.
继续方式一的下载图片,改写一下:
public class CDownload implements Callable<Boolean>{
private String url;
private String name;
public CDownload(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
WebDownLoad wd = new WebDownLoad();
wd.download(url, name);
System.out.println(name);
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CDownload td1 = new CDownload("http://img11.360buyimg.com/n1/s450x450_jfs/t1/95372/26/10103/109107/5e181892Eb698a3bc/2033bb2f00c38f93.jpg", "电脑.jpg");
CDownload td2 = new CDownload("http://img14.360buyimg.com/n1/s450x450_jfs/t1/106229/22/9051/174570/5e0d4a59E099ec5cd/2501bf3e7f96c1fb.jpg", "键盘.jpg");
CDownload td3 = new CDownload("http://img13.360buyimg.com/n1/s450x450_jfs/t1/5916/10/5128/160256/5b9f0e9bEbc9f4db4/14f062751af6ce26.jpg", "鼠标.jpg");
// 创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
// 提交执行
Future<Boolean> r1 = ser.submit(td1);
Future<Boolean> r2 = ser.submit(td2);
Future<Boolean> r3 = ser.submit(td3);
// 获取结果
Boolean ret1 = r1.get();
Boolean ret2 = r2.get();
Boolean ret3 = r3.get();
System.out.println(ret1 + "--" + ret2 + "--" + ret3);
// 关闭服务
ser.shutdownNow();
} }
简单写法:
package com.xzlf.testThread; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; public class TestFutrueTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
// 创建任务
MyCall call = new MyCall();
// 交给任务管理器
FutureTask<String> task = new FutureTask<String>(call);
// 创建代理类并启动线程
new Thread(task).start();
System.out.println("获取结果-->" + task.get());
System.out.println("任务是否执行完成-->" + task.isDone());
}
} class MyCall implements Callable<String>{
@Override
public String call() throws Exception {
String[] strs = new String[]{"java", "pyhton", "html", "orcal", "tomcat"};
String result = strs[(int) (Math.random()*5)];
return result;
}
}
Java 多线程实现方式三:实现 Callable 接口的更多相关文章
- Java多线程带返回值的Callable接口
Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...
- 创建执行线程方式三:实现Callable接口
Callable接口 ① Java 5.0 在 java.util.concurrent 提供了一个新的创建执行 线程的方式:Callable 接口② Callable 接口类似于 Runnable, ...
- 实现多线程的方式之实现Callable接口
package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...
- 51、多线程创建的三种方式之实现Callable接口
实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- JAVA多线程实现的三种方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- AJPFX关于JAVA多线程实现的三种方式
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- JAVA多线程实现的三种方法
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
随机推荐
- coding++:JS数组去重的几种常见方法
一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ function uniq ...
- Android的安装
基于VMware的Android虚拟机搭建 目录 基于VMware的Android虚拟机搭建 下载 安装 配置 使用 下载 进入VMware中国下载VMware Workstation Pro 进入f ...
- 学习方法,学习方式By:ラピスラズリ(Dawn)20200407
原创,转载请注明,谢谢!
- IDEA+EasyCode实现代码生成
IDEA+EasyCode实现代码生成 Easy Code介绍 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据 ...
- [一、Jmeter5安装及环境配置]
前言:Jmeter基于Jave底层开发,需要配置Java运行时环境 第一步:首先从Jmeter的官网下载Jmeter,Oracle官网下载Jave; Apache JMeter 5.2.1(需要Jav ...
- Java项目集成Redis
1.项目pom.xml中添加Jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId ...
- Spring的IOC操作
Spring的IOC操作 把对象的创建交给spring ioc操作两个部分 (1)ioc的配置文件方式 (2)ioc基于注解的方式 IOC 的底层原理 1.ioc底层原理使用技术 (1)xml配置文件 ...
- scarpy爬虫框架
目录 架构介绍 安装创建和启动 配置文件目录介绍 爬取数据,并解析 数据持久化 保存到文件 保存到redis 动作链,控制滑动的验证码 架构介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 ...
- python class类的属性应用及init初始化实践 ---勇者斗恶龙
最近在熟悉python的基础语法,刚好老师布置了个课后作业感觉挺有意思的,就记录下来了学习过程. 题目如下: 刚拿到题目就想到了init 初始化属性,还列了下思路:(ps:notepad++写的比较糙 ...
- AJAX对数据库增删改查实例
前端代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title&g ...