想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?”

稍稍了解过,或者在日常开发中也都会用到以下几种方式:

①继承Thread类(真正意义上的线程类),是Runnable接口的实现。
②实现Runnable接口,并重写里面的run()方法。
③实现Callable接口,重写call()方法,有返回值。
④使用Executor框架创建线程池。Executor框架是juc(java.util.concurrent)包里提供的线程池的实现。

但我这里想说的是,其实以上所有的创建线程的方式,其底层都是实现了Runnable接口。

首先是Thread类(真正意义上的线程类):

他实现了Runnable接口的run()方法,继承Thread类后,你可以重写run()方法实现线程要完成的功能;

当然,Thread类中还定义大量用于线程转换的方法,这个可以见下图(侵删):

PS:notify()、notifyAll()、wait()是Object类的方法

然后是通过实现Runable接口 :

  实现Runnable接口的类需要再次用Thread类包装后才能调用start方法。(三个Thread对象包装一个类对象,就实现了资源共享)。

再是实现Callable接口:

实现Callable接口的类先需要用FutureTask类包装后,再Thread类包装FutureTask类后才能调用start()方法。(三个Thread对象包装一个FutureTask类对象,就实现了资源共享)。FutureTask包装类也是实现了Runnable的子接口RunnableFuture<V>。

最后是使用Executor框架创建线程池:

线程池就是限制系统中使用线程的数量以及更好的使用线程
需要启线程的话,就从线程池里取一个。当使用完了,就“关闭”线程,这不是正在意义上的关闭,只是把线程放回到我们的池里,供其他人在使用。

底层是Worker + workQueue(BlockingQueue<Runnable> )实现的

Worker对象它实现了Runnable接口,你把它当成Runnable的一个代理类即可,最终也是执行它的run()方法。

  这篇博客对它的底层原理解释的很详细,大家可以参照着源码看 剖析ThreadPoolExecutor运行过程

Java 创建线程的方式的更多相关文章

  1. Java创建线程的方式

    Java中线程的创建有四i种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 3.应用程序 ...

  2. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  3. Java多线程学习总结--线程概述及创建线程的方式(1)

    在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...

  4. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  5. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  6. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  7. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

  8. java线程(1)——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

  9. java线程——三种创建线程的方式

    前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...

随机推荐

  1. linux php多版本

    ecshop还非php5.2 解压 gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1 打上php-fpm补丁再安装php ...

  2. 什么是延展性(Malleability,可鍛性)

    原文:http://8btc.com/forum.php?mod=viewthread&tid=23878&page=1#pid270878 1. 什么是延展性(Malleabilit ...

  3. 把IDEA中新建的项目提交到Github仓库中

    对于一个没有进行任何版本控制设置的idea工程,使其支持Github,设置步骤如下 到Git官网下载Git的安装包,安装好以后,Git的安装目录下的文件结构应该如下图所示 在IDEA开发工具中配置Gi ...

  4. python全栈学习笔记(三)网络基础之网络设备及架构介绍

       

  5. java时间操作工具类

    import java.sql.Timestamp;import java.text.DateFormat;import java.text.ParseException;import java.te ...

  6. OC基础数据类型-NSNumber

    1.NSNumber:专门用来装基础类型的对象,把整型.单精度.双精度.字符型等基础类型存储为对象 //基本数据类型 //专门用来装基础类型的对象 NSNumber * intNumber = [[N ...

  7. java IO流 总结

    [-] 1什么是IO 2数据流的基本概念 1 数据流 2 输入流Input  Stream 3 输出流 数据流分类 3 标准IO 命令行参数 标准输入输出数据流 4javaIO层次体系结构 5 非流式 ...

  8. 中间人攻击之劫持登录会话(cookies)

    关于中间人攻击 中间人攻击(Man-in-the-MiddleAttack,简称"MITM攻击")是一种"间接"的入侵攻击,这种攻击模式是通过各种技术手段将受入 ...

  9. char *转string遇到诡异的问题记录

    这个问题的背景是在用libevent的buffer_remove时出现的,写一个伪代码 char buffer[2048] ={0}; string str; int n = buffer_remov ...

  10. Github 删除 repository

    Github 删除 repository 如下图操作