前言

多线程的实现一般有3中方法,其中前两种最常用。

1.继承Thread类,重写run方法

Thread类从本质上来讲,也是实现Runnable接口的一个实例。调用start()方法后只是会使线程处于可运行状态,并不会立即执行多线程代码。至于多线程代码何时运行,有操作系统决定。
步骤:
a.定义Thread类的子类,重写run()方法,run方法体代表了线程要完成的任务。所以run方法也被称为执行体
b.创建Thread子类的实例,即代表创建线程对象
c.调用线程对象的start()方法来启动线程

public class TestThread extends Thread {@Overridepublic void run() {System.out.println("hello world!");}public static void main(String []args){TestThread thread = new TestThread();thread.start();}
}

2.实现Runnable接口,并实现run方法

a.自定义类实现Runnable接口,并实现run方法
b.创建Thread子类实例,用 实现Runnable接口的对象 作为参数实例化该Thread对象
c.调用start方法启动

public class TestRunnable implements Runnable {@Overridepublic void run() {System.out.println("hello world!");}public static void main(String []args){TestRunnable runnable = new TestRunnable();Thread thread = new Thread(runnable);thread.start();}
}

3.实现callable接口,重写call方法

Callable接口实际是属于Executor框架中的功能类,与Runnable接口的功能相似,但提供了比Runnable更强大的功能:
a.Callable可以在任务结束后可以提供一个返回值,Runnable就不行了
b.call()方法可以抛出异常,run方法不可以
c.运行Callable可以拿到一个Future对象,它表示异步计算的结果,提供了检查计算是否完成的方法。因为线程属于异步计算模型,无法从其他线程中获取返回值,此时就可以使用Future来监视目标线程调用call()的情况。但是Future的get()获取结果时,当前线程就会发生阻塞,直到call()返回结果。

public class TestCallable {//创建Callable接口实现类,重写call方法public static class MyTestCallable implements Callable{@Overridepublic Object call() throws Exception {return "hello world!";}}public static void main(String []args){//创建Callable实例MyTestCallable myTestCallable = new MyTestCallable();ExecutorService service = Executors.newSingleThreadExecutor();//单线程化的线程池Future future = service.submit(myTestCallable);try {//等待线程结束并返回结果System.out.println(future.get());}catch (Exception e){e.printStackTrace();}}
}

总结

上述3中方式,推荐使用实现Runnable接口的方式。因为一个类应该在需要加强、修改的时候才会被继承,没必要重写Thread类的其他方法。显然,Runnable接口是最好的选择。

Java创建线程的3种方式相关推荐

  1. java 创建线程_【80期】说出Java创建线程的三种方式及对比

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅. 一.Ja ...

  2. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  3. java创建线程的两种方式及区别

    本文将介绍创建线程的两种方式,示例代码在下面,复制粘贴即可 继承Thread类方式和实现Runnable接口方式 区别:由于在开发的过程中,很多的类都会用到继承的方式,如果采用继承的方式会让各个类之间 ...

  4. Java 创建线程的三种方式

    一.继承Thread类创建 1.定义一个类继承Thread类,并重写Thread类的run()方法,run()方法的方法体就是线程要完成的任务,因此把run()称为线程的执行体: 2.创建该类的实例对 ...

  5. Java多线程 - Java创建线程的4种方式

    文章目录 1. Java创建线程有哪几种方式? 1.1 线程创建方法一:继承Thread类创建线程类 1.2 线程创建方法二:实现Runnable接口创建线程目标类 1.5 线程创建方法三:使用Cal ...

  6. Java创建线程的三种方式,以前只知道两种,现在添加一种Callable与FutureTask创建的方式

    一共有以下三种方式: 1.继承Thread 2.实现Runnable 3.实现Callable,并FutureTask包装 线程启动方式均是使用start()方法 先阐述优缺点: 1和2,3: 2,3 ...

  7. java创建线程池几种方式_java知识总结-创建线程池的6种方式

    一.创建线程池的6种方式: Executors.newCachedThreadPool(); 创建一个可缓存线程池,应用中存在的线程数可以无限大 Executors.newFixedThreadPoo ...

  8. java创建线程的四种方式

    目录 1.直接初始化Thead类,实现Runnable接口 2.继承Thread类 3.实现callable接口 4.使用线程池创建线程 1.直接初始化Thead类,实现Runnable接口 查看Th ...

  9. java创建线程池几种方式_Java 创建线程池两种不同方法的比较

    用Java做抓取的时候免不了要用到多线程的了,因为要同时抓取多个网站或一条线程抓取一个网站的话实在太慢,而且有时一条线程抓取同一个网站的话也比较浪费CPU资源.要用到多线程的等方面,也就免不了对线程的 ...

最新文章

  1. 重磅!GitHub 推出容器镜像仓库服务!
  2. python可视化水平双向箭头_python数据可视化第二弹
  3. dalvik.system.PathClassLoader[DexPathList[[zip file /data/app/comda.xfdsafda.activdity-1/base.apk]
  4. 【Elasticsearch】 es ElasticSearch集群故障案例分析: 警惕通配符查询 Wildcard
  5. python解决xml文件中存在中文文字的问题
  6. Scalaz(47)- scalaz-stream: 深入了解-Source
  7. canvas绘制流程图
  8. java鼠标左键拖拽事件_探索神秘的js拖拽事件
  9. 他山之石:加载图片的一个小问题
  10. 计算机一级考试题库字处理题库,全国计算机一级考试题库试题
  11. JAVA王思聪吃热狗程序_王思聪吃热狗什么梗?
  12. hmailserver mysql密码_mysql+hmailserver+roundcube修改密码
  13. 直播提醒|今晚八点半,最硬核情感分析技术讲解来袭!内附SKEP详解+大作业指导!...
  14. w ndows无法完成格式化,windows无法完成格式化,详细教您解决windows无法完成格式化U盘...
  15. 8 大主流自媒体平台优缺点分析以及运营建议
  16. 【活动预告】说说对 Coding 新一年的期许, Filco 蓝牙无线机械键盘等你拿!
  17. Sunshine数据库篇之查询
  18. 商业级、工业级、军品级、宇航级CPU有着不同标准
  19. 我的资源里边有好东西(gmt、panoply等等)
  20. 使用火焰传感器和Arduino开发板搭建火灾报警系统

热门文章

  1. [转载]树莓派新版系统上使用mjpg-streamer获取USB摄像头和树莓派专用摄像头RaspiCamera图像...
  2. 顺丰被删库?半个DBA的跑路经验总结
  3. Centos下运行gpg --gen-key生成key时出现卡住解决方案笔记
  4. 编写高性能的 Lua 代码
  5. python模块之HTMLParser之穆雪峰的案例(理解其用法原理)
  6. C语言中不同类型的循环(Different types of loops in C)
  7. Android开发实战三之导入现有Android工程项目
  8. [linux基础学习]文件和目录属性
  9. Linux退出vi编辑
  10. AI 实验--v_JULY_v