概述

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();
}

执行结果

并发编程>>四种实现方式(三)的更多相关文章

  1. 【连载】redis库存操作,分布式锁的四种实现方式[三]--基于Redis watch机制实现分布式锁

    一.redis的事务介绍 1. Redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行.而一旦客户端发 ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  3. js介绍,js三种引入方式,js选择器,js四种调试方式,js操作页面文档DOM(修改文本,修改css样式,修改属性)

    js介绍 js运行编写在浏览器上的脚本语言(外挂,具有逻辑性) 脚本语言:运行在浏览器上的独立的代码块(具有逻辑性) 操作BOM 浏览器对象盒子 操作DOM 文本对象 js三种引入方式 (1)行间式: ...

  4. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  5. Android开发之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...

  6. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  7. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  8. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

  9. SpringMVC的REST风格的四种请求方式

    一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET  ====== 获 取资源 2.POST ======新建资源 ...

随机推荐

  1. golang之流程控制(注意点)

    Go在流程控制方面特点如下: 没有do和while循环,只有一个广义的for语句 switch语句灵活多变,还可以用于类型判断 if语句和switch语句都可以包含一条初始化子语句 break语句和c ...

  2. android4.2 高用zing拍照后,返回其它页面操作时,主线程关掉或程序退出的问题解决

    产生错误的代码: @Override protected void onCreate(Bundle savedInstanceState) { StrictMode.setThreadPolicy(n ...

  3. XtrasReport 标签打印

    var lblList = new List<product_LblPrt_tmp>(); using (JL_MFGEntities ctx = new JL_MFGEntities() ...

  4. 安装一个Redis

    1. 官网 http://redis.io/ 2.下载 官方不提供windows版本,但https://github.com/MSOpenTech/redis 可以从这里获取64位. 3.

  5. mysql 更新替换字符串

    update zxg set newlevel = REPLACE(newlevel,'b','') 把表zxg中的newlevel字段中的b删除

  6. Thrift编译错误('::malloc' has not been declared)

    问题版本:0.9.0 make[4]: Entering directory `/tmp/X/thrift-0.9.0/lib/cpp' /bin/sh ../../libtool  --tag=CX ...

  7. [转]How to Clean the Global Assembly Cache

    本文转自:https://www.techwalla.com/articles/how-to-clean-the-global-assembly-cache The Global Assembly C ...

  8. GlusteFS 二

    通过heketi提供的RestfullApi来管理 Gluster,进而与kubernetes集成.将gluster作为kubernetes的数据存储 1 安装 安装gluster 参见 Gluste ...

  9. [JAVA]java复制文件的4种方式

    尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...

  10. UWP开发入门(一)——SplitView

    接下来会写一个UWP(Universal Windows Platform)开发入门的系列,自己学习到哪里,有什么心得总结,就会写到哪里.本篇对适用于顶层导航的SplitView控件展开讨论. 首先S ...