文章目录

  • 实现方式
    • 继承Thread类实现多线程
    • 实现Runnable接口实现多线程。示例如下:
    • 实现Callable接口并通过FutureTask包装器创建线程。示例如下:
    • 使用ExecutorService、Callable、Future实现多线程。示例如下:
  • 不同实现方式的差异

实现方式

Java多线程共有四种不同的实现方式:分别为继承Thread类、实现Runnable接口,实现Callable接口并通过FutureTask包装器创建线程,使用ExecutorService、Callable、Future实现多线程。

继承Thread类实现多线程

Thread类本质上实现了Runnable接口,代表一个线程的实例。启动线程的唯一方法是调用类的start方法。start方法是一个native方法,它将启动一个新线程,并执行run方法。

以这种方式实现多线程较为简单:首先定义自己的类,然后自己的类继承Thread类,并重写run()方法,调用start方法就可以启动一个新线程并执行run方法。示例如下:

public class ThreadDemo extends Thread{public void run(){System.out.println("ThreadDemo start..");}public static void main(String[] args) {ThreadDemo td = new ThreadDemo();td.start();}
}

实现Runnable接口实现多线程。示例如下:

public class RunnableDemo implements Runnable{@Overridepublic void run() {System.out.println("RunnableDemo start..");}public static void main(String[] args) {RunnableDemo rd = new RunnableDemo();Thread t = new Thread(rd);t.start();}
}

实现Callable接口并通过FutureTask包装器创建线程。示例如下:

public class CallableDemo{public static void main(String[] args) throws InterruptedException, ExecutionException {Callable<Integer> call = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {System.out.println("callable thread start..");Thread.sleep(2000);return 1;}};FutureTask<Integer> task = new FutureTask<>(call);Thread t =  new Thread(task);t.start();System.out.println("do other thing..");System.out.println("callable res=" + task.get());}
}

使用ExecutorService、Callable、Future实现多线程。示例如下:

public class ExecutorServiceDemo {public static void main(String[] args) throws InterruptedException, ExecutionException {System.out.println("main start..");int taskSize = 5;ExecutorService pool = Executors.newFixedThreadPool(taskSize);List<Future<Integer>> list = new ArrayList<Future<Integer>>();for (int i = 0; i < taskSize; i++) {Callable<Integer> c = new MyCallable<Integer>(i + " ");Future<Integer> f = pool.submit(c);list.add(f);}pool.shutdown();for (Future<Integer> f : list) {System.out.println("threads res=" + f.get());}}
}class MyCallable<Integer> implements Callable<Integer> {private String taskNum;MyCallable(String taskNum) {this.taskNum = taskNum;}public Integer call() throws Exception {System.out.println("---" + taskNum + " thread start");Date dateStart = new Date();Thread.sleep(1000);Date dateEnd = new Date();long time = dateEnd.getTime() - dateStart.getTime();return (Integer) (taskNum + " end require[" + time + "ms]");}
}

不同实现方式的差异

  • 如果自己定义的类已经继承了其他类,由于java是单根继承,故只能通过实现接口实现多线程。
  • 继承Thread类和实现Runnable接口实现多线程,没有返回值;实现Callable接口和利用ExecutorService实现多线程可以有返回值,并封装与FutureTask和Future中,值得注意的是,获取返回值的get方法,是阻塞方法,即必须等到线程执行结束才能得到返回值。
  • 继承Thread类和实现Runnable接口实现多线程,不能抛出异常;实现Callable接口和利用ExecutorService
    实现多线程,可以抛出异常。

Java多线程实现方式相关推荐

  1. Java多线程:实现方式Thread与Runnable

    转载自  Java多线程:实现方式 在Java中, 多线程的实现有两种方式: 扩展java.lang.Thread类 实现java.lang.Runnable接口 方法1 /** * @Descrip ...

  2. Java多线程-通讯方式

    Java多线程-通讯方式 线程之间为什么要通信? 通信的目的是为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知.那么java线程是如何通信的呢,大致有以下六种方式. Java线 ...

  3. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. java实现多线程抢单_来聊一聊3种实现JAVA多线程的方式吧

    在Java中,实现多线程的方式有3种,分别是继承Thread类.实现Runnable接口.实现Callable接口.关于它们是如何实现,有何区别呢? 方式一:继承Thread类 一个普通类只要继承了传 ...

  5. 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. java多线程创建方式以及线程安全

    什么是线程 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位.每个程序程序都至少有一个线程,也即是程序本身. 线程的状态 新建(New):创建后尚未启动的 ...

  8. Java多线程创建方式初探

    多线程概述 抢占式多任务 直接中断而不需要事先和被中断程序协商 协作多任务 被中断程序同意交出控制权之后才能执行中断 多线程和多进程区别? 本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同 ...

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

    java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...

最新文章

  1. 【驱动】内核打印级别设置
  2. java未知对象调用其某个方法_java如何调用一个方法内的对象
  3. Storm源码分析之四: Trident源码分析
  4. CRM呼叫中心和社交媒体集成的UI错误信息显示机制
  5. 毕业之后......
  6. localstorage和sessionStorage和cookies
  7. 2016考试计算机知识基础题库,2016年计算机二级公共基础知识基础练习题演练(6)...
  8. Eclipse设置中文汉化
  9. 利用Tukey方法识别离群值
  10. ubuntu 中 vi 编辑文件上下左右删除键毫无作用肿么办!(上上下下左右左右BABA)
  11. sfu计算机硕士,别告诉我你了解菲莎国际学院
  12. 深圳圈子联合将出席2016IT领袖峰会
  13. 学习篇之数据分析库pandas
  14. 华为正式发布鸿蒙 2.0,更新人数太多挤爆服务器,P50 也官宣了!
  15. 目前支持WebGL的浏览器有哪些?
  16. 中国连锁药店行业发展机遇与竞争格局分析报告2022-2028年版
  17. Golang iota踩坑
  18. Partition函数实现java(含分析)
  19. 赛宝-亿能软件测试技术沙龙第1期 – 性能测试工程师职业规划与成长之路
  20. WSO2 ESB 学习(二) ---安装篇

热门文章

  1. 虚继承,虚基类以及虚继承的构造函数
  2. 抖音mysql_抖音经典小句子,很哭很洒脱,发朋友圈让你魅力大增!
  3. 随机数生成工具类(中文姓名,性别,Email,手机号,住址)
  4. python对excel两列求和写入另一列_python读取excel指定列数据并写入到新的excel方法...
  5. unity-高通增强现实
  6. [高通MSM8909][Android7.1]移除电池显示选项
  7. hrbust 1401 九连环(矩阵快速幂)
  8. 中国出海秀:暴涨153% 国产游戏在韩7月又占前十半壁江山
  9. Markdown插入图片 详细例子(本地图片,网络图片,base64) Windows
  10. speedoffice如何在Word文档中插入空白页