1.继承Thread,并重写run()方法,重写run方法,该方法是线程执行体

public class MyThread extends Thread{

int i=0;

@Override

public void run() {

for (; i < 100; i++) {

System.out.println(getName() + ":" + i);

}

}

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + ":" + i);

if (i == 20) {

new MyThread().start();

new MyThread().start();

}

}

}

}

2.通过Runable去创建线程,也是重写run方法,该方法是线程执行体

public class MyRunnable implements Runnable {

private int i=0;

@Override

/**

* 重写run方法,该方法同样是该线程的线程执行体

*/

public void run() {

for (; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + ":" + i);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + ":" + i);

if (i == 20) {

MyRunnable runnable = new MyRunnable();

//该Thread对象才是真正的线程对象.

new Thread(runnable, "新线程-1").start();

new Thread(runnable, "新线程-2").start();

}

}

}

}

执行结果部分结果:

新线程-2:80

新线程-1:81

新线程-2:82

新线程-1:83

新线程-2:84

新线程-1:85

新线程-2:86

新线程-1:87

新线程-2:88

新线程-1:89

新线程-2:90

新线程-1:91

新线程-2:92

新线程-1:93

新线程-2:94

新线程-1:95

新线程-2:96

新线程-1:97

新线程-2:98

新线程-1:99

可以看出线程1和线程2共享了MyRunnable实例对象的i。

3.通过Callable和Future创建线程,通过继承Thread和Runable创建的线程,在线程执行完成之后无法获取执行结果。

如果需要获取线程执行结果,就需要通过共享变量或者是线程通信的方法来达到效果,使用起来比较麻烦。

通过重写Callable接口中的call()方法,该方法是有返回值的,Future可以得到线程执行完成之后的结果值。

public class MyCallable implements Callable {

@Override

/**

* 重写call方法,即为线程的执行体

*/

public Integer call() throws Exception {

int i = 0;

for (; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + ":" + i);

}

return i;

}

public static void main(String[] args) {

//获取实习callable接口的类的实例

MyCallable callable = new MyCallable();

//使用FutureTask类来包装Callable对象,

// 该FutureTask对象封装了该Callable对象的call()方法的返回值。

FutureTask task = new FutureTask<>(callable);

for (int i = 0; i < 100; i++) {

System.out.println(Thread.currentThread().getName() + ":" + i);

if (i == 20) {

new Thread(task, "有返回值的线程").start();

try {

System.out.println("子线程的返回值:" + task.get());

} catch (InterruptedException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

}

}

}

}

}

三种创建线程方式比较:

1)实现Runnable和Callable接口,还可以继承其他类,继承了Thread类就不能集成其他类型。

2)继承Thread类编程比较简单,如果要访问当前线程,可以直接使用this指针得到,如果是实现Runnable和Callable接口,要使用Thread.currentThread()方法得到当前线程

3)实现Runnable和Callable接口时,多个线程可以共享一个实现Runnable和Callable接口类的实例变量,但是如果继承Thread类的话,每一个线程都要新建一个实例对象。

4)实现Callable接口,允许线程执行完成之后,返回执行结果。

在java创建线程结果_Java创建线程的三种方式相关推荐

  1. java tostring格式化日期_Java格式化日期的三种方式

    1)借助DateFormat类: public String toString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat(" ...

  2. java的依赖注入_Java依赖注入的三种方式

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:组织方式注入,setter注入,基于注解的注入. 组织方式注入 组织器注入:保证了一些需要的属性在Bean实例化时就设 ...

  3. JS基础-Java Class类以及获取Class实例的三种方式

    JS基础-Java Class类以及获取Class实例的三种方式 由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名.包名.父类.实现的接口. ...

  4. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  5. java 读取css文件_java文件读取的两种方式

    JAVA中读取文件(二进制,字符)内容的几种方 JAVA中读取文件内容的方法有很多,比如按字节读取文件内容,按字符读取文件内容,按行读取文件内容,随机读取文件内容等方法,本文就以上方法的具体实现给出代 ...

  6. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...

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

  7. java时间戳是什么类型_java 获取时间戳的三种方式

    java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...

  8. java实现多线程抢单_JAVA实现多线程的四种方式

    JAVA多线程实现方式: 1.继承Thread类(无返回值) 2.实现Runnable接口(无返回值) 3.实现Callable接口,通过FutureTask包装器来创建Threak线程(有返回值) ...

  9. java多线程的实现方式_JAVA多线程实现的三种方式

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用E ...

  10. java map 迭代遍历_java 遍历Map的四种方式

    java 遍历Map的四种方式 CreationTime--2018年7月16日16点15分 Author:Marydon 一.迭代key&value 第一种方式:迭代entrySet 1.方 ...

最新文章

  1. Python 技术篇-用PIL库修改图片透明度实例演示,改变png图片色道为RGBA、RGB
  2. 最好的电脑系统_热键被占用怎么办?电脑系统 程序 游戏热键被占用冲突如何解决?...
  3. 【Minimum Depth of Binary Tree】cpp
  4. 深度学习基础知识介绍
  5. MySQL错误1264和1366_Mysql错误1366 - Incorrect integer value解决方法
  6. Vuejs:组件 slot 内容分发
  7. 注释那些事儿:前端代码质量系列文章(一)
  8. emq数据储存到mysql,规则引擎示例 - 保存数据到 MySQL - 《EMQ X Enterprise v4.0 中文文档》 - 书栈网 · BookStack...
  9. 6.跑步者--并行编程框架 ForkJoin
  10. 源码时代html考试题,源码时代老师详解Web前端开发的三要素
  11. Android常用应用市场包名
  12. web安全工具介绍(漏洞扫描、信息收集、提升权限的网站、app)持续更新
  13. 板载天线设计相关资料
  14. 计算机c盘能备份数据吗,怎么备份C盘数据
  15. 内存管理_分代机制(年轻代、年老代、永久代)
  16. Linux系统中errno对应的中文意思 errno.h
  17. 安卓与苹果盒子与h5相互调用,js,vue
  18. 迷宫求解【穷举求解法】
  19. 同样的程序每次运行的时间不一样
  20. Linux查看磁盘使用情况

热门文章

  1. 个人Web自动化测试学习点总结
  2. Java用WebSocket + tail命令实现Web实时日志
  3. length属性,length()方法和size()的方法的区别
  4. SCVMM 2012 R2---添加Hyper-V虚拟机
  5. 收藏一篇关于 用两个栈实现一个队列功能的帖子
  6. 在.net中使用sqlite
  7. java抽象类可以new_java的抽象类,接口,普通类是否可以直接NEW,并且复写方法?
  8. Git - 命令行 - 使用 Tag 标记你的代码
  9. ISIS出现(Project2.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.)异常
  10. matlab模式识别大作业_史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)...