并发编程>>四种实现方式(三)
概述
1、继承Thread
2、实现Runable接口
3、实现Callable接口通过FutureTask包装器来创建Thread线程
4、通过Executor框架实现多线程的结构化,即线程池实现。(该实现方式将会下一篇单独介绍)
1、继承Thread
class CreateThreadByExtendThread extends Thread {
public CreateThreadByExtendThread(String name) {
super(name);
}
@Override
public void run() {
for(int i=0;i<=2;i++) {
System.out.println(Thread.currentThread().getName()+"线程,线程号{"+Thread.currentThread().getId()+"},i="+i);
}
}
}
2、实现Runable接口
class CreateThreadByImpleRunable implements Runnable{
@Override
public void run() {
for(int i=0;i<=2;i++) {
System.out.println(Thread.currentThread().getName()+"线程,线程号{"+Thread.currentThread().getId()+"},i="+i);
}
} }
执行CreateThreadByExtendThread和CreateThreadByImpleRunable
public class CreateThread { public CreateThread() {
// TODO Auto-generated constructor stub
}
/**
* <p>
* 测试并发编程实现方式
* </p>
* @param args
*/
public static void main(String[] args) {
CreateThreadByExtendThread ctetThread = new CreateThreadByExtendThread("AAAA");
ctetThread.start();
Thread ctbrThread = new Thread(new CreateThreadByImpleRunable(),"BBBB");
ctbrThread.start();
}
}
执行结果
上述是无返回结果的线程,二者区别:Thread类实现了Runable接口。从代码灵活性的角度考虑建议使用第二种方式。
3、实现Callable接口通过FutureTask包装器来创建Thread线程
class CreateThreadByImpleCallable<String> implements Callable<String>{
private CreateThreadByImpleCallable<String> ctbc = null;
@Override
public String call() throws Exception {
for(int i=0;i<=2;i++) {
System.out.println(Thread.currentThread().getName()+"线程,线程号{"+Thread.currentThread().getId()+"},i="+i);
}
return (String) "Game over";
}
public String getTask() throws InterruptedException, ExecutionException {
ctbc = ctbc == null ? new CreateThreadByImpleCallable<String>() : ctbc;
FutureTask<String> ftTask = new FutureTask<String>(ctbc);
Thread ftThread = new Thread(ftTask,"CCCC");
ftThread.start();
return ftTask.get();
} }
上述main方法添加此行代码
try {
System.out.print(new CreateThreadByImpleCallable<String>().getTask());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
执行结果
并发编程>>四种实现方式(三)的更多相关文章
- 【连载】redis库存操作,分布式锁的四种实现方式[三]--基于Redis watch机制实现分布式锁
一.redis的事务介绍 1. Redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行.而一旦客户端发 ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- js介绍,js三种引入方式,js选择器,js四种调试方式,js操作页面文档DOM(修改文本,修改css样式,修改属性)
js介绍 js运行编写在浏览器上的脚本语言(外挂,具有逻辑性) 脚本语言:运行在浏览器上的独立的代码块(具有逻辑性) 操作BOM 浏览器对象盒子 操作DOM 文本对象 js三种引入方式 (1)行间式: ...
- (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- SpringMVC的REST风格的四种请求方式
一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET ====== 获 取资源 2.POST ======新建资源 ...
随机推荐
- ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面
ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面(初步断定是Xwindows界面软件出问题了,所以重装即可!)Solve: 1.Ctrl+Alt+F1进入命令行界面,root账户登陆2. ...
- c11时间库一个小例子
#pragma once #include <chrono> #include <string> #include <iostream> #include < ...
- AngularJs2.0
AngularJs2.0中文官网站发布了. 官网地址:https://angular.cn/ 官网点击任何中文地方都可以显示英文原文,中文文档暂时只有 TypeScript的,JavaScript和d ...
- 与table有关的布局
当IE8发布时,它将支持很多新的CSS display属性值,包括与表格相关的属性值:table.table-row和table-cell,它也是最后一款支持这些属性值的主流浏览器.它标志着复杂CSS ...
- jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...
- 20155308 2016-2017-2 《Java程序设计》第8周学习总结
20155308 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO(New IO)-from JDK1.4 NIO2 -fr ...
- URAL1991 The battle near the swamp 2017-04-12 18:07 92人阅读 评论(0) 收藏
The battle near the swamp Gungan: Jar Jar, usen da booma! Jar Jar: What? Mesa no have a booma! Gun ...
- 转:css实现强制不换行/自动换行/强制换行
css实现强制不换行/自动换行/强制换行 [日期:2007-08-22] 来源: 作者: [字体:大 中 小] 强制不换行 div{ white-space:nowrap;} 自动换行 div{ ...
- 从极速飞艇源码 VantComponent 谈 小程序维护
在开发极速飞艇源码详情咨询Q166848365小程序的时候,我们总是期望用以往的技术规范和语法特点来书写当前的小程序,所以才会有各色的小程序框架,例如 mpvue.taro 等这些编译型框架.当然这些 ...
- ajax 与 form 提交的区别
有如下几种区别: 1. Ajax在提交.请求.接收时,都是异步进行的,网页不需要刷新:Form提交则是新建一个页面,哪怕是提交给自己本身的页面,也是需要刷新的: 2. A在提交时,是在后台新建一个请求 ...