通过Callable接口实现多线程
一.通过Callable接口实现多线程
c.实现Callable重写call方法
实现Callable和实现Runnable类似,但是功能更强大,具体表现在
a.可以在任务结束后提供一个返回值,Runnable不行
b.call方法可以抛出异常,Runnable的run方法不行
c.可以通过运行Callable得到的Fulture对象监听目标线程调用call方法的结果,得到返回值,(fulture.get(),调用后会阻塞,直到获取到返回值)
1.Callable接口介绍:
(1)java.util.concurrent.Callable是一个泛型接口,只有一个call()方法
(2)call()方法抛出异常Exception异常,且返回一个指定的泛型类对象
2.Callable接口实现多线程的应用场景
(1)当父线程想要获取子线程的运行结果时
3.使用Callable接口实现多线程的步骤
(1)第一步:创建Callable子类的实例化对象
(2)第二步:创建FutureTask对象,并将Callable对象传入FutureTask的构造方法中
(注意:FutureTask实现了Runnable接口和Future接口)
(3)第三步:实例化Thread对象,并在构造方法中传入FurureTask对象
(4)第四步:启动线程
例1(利用Callable接口实现线程):
利用Callable接口创建子线程类:
package com.my.frame; import java.util.concurrent.Callable; public class ThreadCall implements Callable<String> { @Override
public String call() throws Exception {
// TODO Auto-generated method stub
System.out.println("=====");
return "9999";
} }
package com.my.frame; import java.util.concurrent.FutureTask; public class TestThread {
public static void main(String[] args) { FutureTask<String> ft = new FutureTask<>(new ThreadCall());
new Thread(ft).start();
} }
例2(匿名类部类实现Callable接口创建子线程):
匿名类部类实现Callable接口创建子线程类并实现:
package call; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; //匿名类部类实现Callable接口创建子线程 public class AnonyCallable { public static void main(String[] args) { Callable<String> cl = new Callable<String>() { @Override public String call() throws Exception { System.out.println(Thread.currentThread().getName() + "正在行军~~~"); System.out.println(Thread.currentThread().getName() + "遭遇敌军~~~"); System.out.println(Thread.currentThread().getName() + "奋勇杀敌!!!!"); return "战斗胜利,俘虏敌军50000人"; } }; FutureTask<String> ft = new FutureTask(cl); new Thread(ft, "李存孝部队").start(); try { Thread.currentThread().setName("李存勖部队"); Thread.sleep(3000); System.out.println(Thread.currentThread().getName() + "休整3000ms"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "整顿完毕,等待友军消息..."); try { String str = ft.get(); System.out.println("李存勖部队得知友军消息为:" + str); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } }
}
通过Callable接口实现多线程的更多相关文章
- 使用Runnable和Callable接口实现多线程的区别
使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...
- 实现Callable接口实现多线程
package com.roocon.thread.t2; import java.util.concurrent.Callable; import java.util.concurrent.Exec ...
- callable接口的多线程实现方式
package com.cxy.juc; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionExce ...
- 使用Callable接口创建线程和使用线程池的方式创建线程
1.使用Callable接口的方式实现多线程,这是JDK5.0新增的一种创建多线程的方法 package com.baozi.java2; import java.util.concurrent.Ca ...
- 使用Thread类和Runnable接口实现多线程的区别
使用Thread类和Runnable接口实现多线程的区别 先看两种实现方式的步骤: public class ThreadDemo{ public static void main(String[] ...
- 多线程——实现Callable接口
前两篇博客(多线程--继承Thread类.多线程--实现Runnable接口 )介绍了java使用线程的两种方法.这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和C ...
- 实现多线程的方式之实现Callable接口
package com.hls.juc; import java.util.concurrent.Callable;import java.util.concurrent.ExecutionExcep ...
- 51、多线程创建的三种方式之实现Callable接口
实现Callable接口创建线程 Callable接口是在jdk5版本中加入的,这个接口在java.util.concurrent包下面,与其他两种方式不同的地方在于使用Callable接口创建的线程 ...
- 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全
1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...
随机推荐
- DML语句
DML 操作是指对数据库中表记录的操作,主要包括表记录的插入(insert).更新(update).删除(delete)和查询(select),是开发人员日常使用最频繁的操作. 插入记录 表创建好后, ...
- MySQL主从双向同步
最近部署测试环境,涉及到MySQL数据库主从双向同步的部署,记录一下部署过程,正常读写都发生在主库,从库作为备选数据库(热备份),当主库发生异常,数据库自动切换到从库,这里面是怎么监控数据库异常并触发 ...
- PLSQL连接本地oracle或远程oracle数据库,实现随意切换
转: PLSQL连接本地oracle或远程oracle数据库,实现随意切换 置顶 2018年01月12日 19:36:45 前方一片光明 阅读数 43542 版权声明:本文为博主原创文章,未经博主 ...
- 自定义zabbix脚本--网卡平均流量
自定义zabbix脚本--网卡平均流量1. 在客户端修改配置文件 /etc/zabbix/zabbix_agentd.conf需要改动两个地方:(1) UnsafeUserParameters=1(2 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_5-1.数据信息安全--微信授权一键登录功能介绍
笔记 1.数据信息安全--微信授权一键登录功能介绍 简介:讲解登录方式优缺点和微信授权一键登录功能介绍 1.手机号或者邮箱注册 优点: ...
- 数学建模python matlab 编程(指派问题)
指派授课问题 现有A.B.C.D四门课程,需由甲.乙.丙.丁四人讲授,并且规定: 每人只讲且必须讲1门课:每门课必须且只需1人讲. 四人分别讲每门课的费用示于表中: 课 费用 人 A B C D 甲 ...
- Linux任务后台运行的方法
linux在后台运行程序当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件.对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时 ...
- kettle在linux下面用于shell脚本执行:转换或者作业
1 将windows下面创建好的转换,放到Linux某一个文件夹下面.如:把0816_em.ktr文件放到/home/cfj/kettle/testdemo下面. 注意里面的数据库用户名和密码可能需要 ...
- 数组中存放model去重
在这个项目中出现"添加model数据"数组重复的情况,这就涉及到数组去重的问题了...... 1. 一开始使用的最笨的方法: 依次循环两个数组(原有的数组,选择的数组),双重for ...
- 使用kubeadm安装kubernetes1.12.2版本脚本【h】
Master节点脚本: #!/bin/sh#使用系统的PATH环境export PATH=`echo $PATH` #停止firewall防火墙,并禁止开机自启动 systemctl stop fir ...