Java 创建线程的方式
想必大家在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 创建线程的方式的更多相关文章
- Java创建线程的方式
		
Java中线程的创建有四i种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. 通过实现Runnable接口,实例化Thread类 3.应用程序 ...
 - Java学习笔记-多线程-创建线程的方式
		
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
 - Java多线程学习总结--线程概述及创建线程的方式(1)
		
在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...
 - -1-5  java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
		
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
 - 操作系统实现线程的几种模式 和 java创建线程的3个方式
		
操作系统实现线程的几种模式 和 java创建线程的3个方式 这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...
 - Java并发编程:Java创建线程的三种方式
		
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
 - Java创建线程的三种主要方式
		
Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...
 - java线程(1)——三种创建线程的方式
		
前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...
 - java线程——三种创建线程的方式
		
前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...
 
随机推荐
- 【转载】javascript深入理解js闭包
			
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
 - 工作笔记—hibernate之QueryCriteria
			
本人用的是sg-uap虚拟环境 //查询方法 //参数 RequestCondition 配合 controller 的 @QueryRequestParam注解可以将前台传入整个对象进行接收 //参 ...
 - ArrayList排序Sort()方法(转)
			
//使用Sort方法,可以对集合中的元素进行排序.Sort有三种重载方法,声明代码如下所//示. public void Sort(); //使用集合元素的比较方式进行排序 public void S ...
 - HTML 段落p
			
可以把 HTML 文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>This is a paragraph</p> <p&g ...
 - IIS7下设置上传大小的限制
			
一.找到修改大小的配置文件和配置节点 打开你系统盘(我是C盘),找到 C:\Windows\System32\inetsrv\config\schema目录,该目录下有一个IIS_schema.xml ...
 - 【Leetcode】【Medium】Validate Binary Search Tree
			
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
 - Entity Framework: 主从表的增删改
			
1.根据主表添加从表数据 var dest = (from d in context.Destinations where d.Name == "Bali" select d).S ...
 - SAP Cloud for Customer销售订单External Note的建模细节
			
SAP Cloud for Customer的销售订单创建页面里,我们可以给一个订单维护External Note,当这个订单同步到S/4HANA生成对应的生产订单后,这个note可以作为备注提示生产 ...
 - [原]零基础学习SDL开发之在Android使用SDL2.0加载字体
			
在上一篇文章我们知道了如何在android使用SDL2.0来渲染显示一张png图,而且在上上一篇我们知道如何使用sdl来渲染输出bmp图,那么sdl是否可以渲染输出自己喜爱的字体库的字体呢?答案是当然 ...
 - 手把手带你理解style
			
在写代码的时候,经常遇到自定义的style,有的用来设置属性,有的用来设置主题,搞的自己云里雾里,因此在心底暗暗发誓,等到空闲的时候,一定好好学学android中的style的究竟是个什么东西,到底有 ...