java多线程总结一:线程的两种创建方式及优劣比较
1、通过实现Runnable接口线程创建
(1).定义一个类实现Runnable接口,重写接口中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).创建Runnable接口实现类的对象。
(3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象。(接口可以实现多继承)
(4).调用Thread对象的start()方法,启动线程
示例代码:
- <span style="font-size:16px;">package demo.thread;
- public class TreadDemo1 implements Runnable {
- private int countDown = 10;
- @Override
- // 在run方法中定义任务
- public void run() {
- while (countDown-- > 0) {
- System.out.println("#" + Thread.currentThread().getName() + "("
- + countDown + ")");
- }
- }
- public static void main(String[] args) {
- // Runnable中run方法是一个空方法,并不会产生任何线程行为,必须显式地将一个任务附着到线程上
- TreadDemo1 tt=new TreadDemo1();
- new Thread(tt).start();
- new Thread(tt).start();
- System.out.println("火箭发射前倒计时:");
- }
- }
- </span>
运行结果:
火箭发射前倒计时:
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
#Thread-0(9)
2、通过继承Thread类创建线程
(1).首先定义一个类去继承Thread父类,重写父类中的run()方法。在run()方法中加入具体的任务代码或处理逻辑。
(2).直接创建一个ThreadDemo2类的对象,也可以利用多态性,变量声明为父类的类型。
(3).调用start方法,线程t启动,隐含的调用run()方法。
示例代码:
- <span style="font-size:16px;">package demo.thread;
- public class ThreadDemo2 extends Thread {
- private int countDown = 10;
- @Override
- // 在run方法中定义任务
- public void run() {
- while (countDown-- > 0) {
- System.out.println("#" + this.getName() + "(" + countDown + ")");
- }
- }
- public static void main(String[] args) {
- new ThreadDemo2().start();
- new ThreadDemo2().start();
- // 由于start方法迅速返回,所以main线程可以执行其他的操作,此时有两个独立的线程在并发运行
- System.out.println("火箭发射前倒计时:");
- }
- }
- </span>
运行结果:
#Thread-0(9)
#Thread-0(8)
#Thread-0(7)
#Thread-0(6)
#Thread-0(5)
#Thread-0(4)
#Thread-0(3)
#Thread-0(2)
#Thread-0(1)
#Thread-0(0)
火箭发射前倒计时:
#Thread-1(9)
#Thread-1(8)
#Thread-1(7)
#Thread-1(6)
#Thread-1(5)
#Thread-1(4)
#Thread-1(3)
#Thread-1(2)
#Thread-1(1)
#Thread-1(0)
3、两种方式的比较
首先分析两种方式的输出结果,同样是创建了两个线程,为什么结果不一样呢?
使用实现Runnable接口方式创建线程可以共享同一个目标对象(TreadDemo1 tt=new TreadDemo1();),实现了多个相同线程处理同一份资源。
然后再看一段来自JDK的解释:
Runnable
接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run
的无参数方法。
设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread
类实现了Runnable
。激活的意思是说某个线程已启动并且尚未停止。
此外,Runnable
为非 Thread
子类的类提供了一种激活方式。通过实例化某个Thread
实例并将自身作为运行目标,就可以运行实现 Runnable
的类而无需创建 Thread
的子类。大多数情况下,如果只想重写run()
方法,而不重写其他 Thread
方法,那么应使用 Runnable
接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
转载于:https://www.cnblogs.com/kinghitomi/archive/2012/01/19/2327405.html
java多线程总结一:线程的两种创建方式及优劣比较相关推荐
- java多线程总结一:线程的两种创建方式及比较
1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应 ...
- 【无标题】单例模式的两种创建方式:饿汉式和懒汉式
这里写自定义目录标题 单例模式的两种创建方式:饿汉式和懒汉式 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂 ...
- 线程的三种创建方式和他们的优缺点
文章目录 一.线程的三种创建方式 1.继承Thread 2.实现Runable接口 3.实现Callable接口 二.三种创建方式的优缺点 1.使用Runnable接口比使用继承Thread的优势 2 ...
- Java线程的两种实现方式
前言 线程是程序的一条执行线索,执行路径,是程序使用cpu的最小单位.线程本身不能运行,它只能运行在程序中,线程是依赖于程序存在的. 多线程的意义 其实任何一个程序的执行都需要获得cpu的执行权,是由 ...
- eclipse让实现类也添加上接口的注释_多线程:面试常问的两种创建方式,数据共享实现和正确停止线程...
多线程 进程与线程的区别: 进程:程序的执行过程,持有资源(内存)(共享内存和文件)和线程.比如,电脑上的eclipse.QQ.微信等运行中的软件就是一个进程 线程应用:1.eclipse编辑代码时, ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- 初始化一个java空数组_Java 数组的两种初始化方式
一.数组 1.数组中存储元素的类型是统一的,每一个元素在内存中所占用的空间大小是相同的,知道数组的首元素的内存地址,要查找的元素只要知道下标,就可以快速的计算出偏移量,通过首元素内存地址加上偏移量,就 ...
- java匿名内部类_java中匿名内部类的两种实现方式
使用匿名内部类课使代码更加简洁.紧凑,模块化程度更高.内部类能够访问外部内的一切成员变量和方法,包括私有的,而实现接口或继承类做不到.然而这个不是我说的重点,我说的很简单,就是匿名内部类的两种实现方式 ...
- 线程的三种创建方式以及代码实现
线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...
最新文章
- MVVMLight 实现指定Frame控件的导航
- GPUImage 简介
- Capture One如何创建和应用样式和预设?
- MySQL(17)-----数值函数
- 联想服务器改win7系统教程,联想笔记本Win10改Win7方法分享
- 百度认证(深度学习初级工程师)考试题2
- 怎么通过当地时区计算格林尼治_地球运动之“时间计算”练习二(干货)
- vscode 文件夹中查找_VSCode 多文件搜索和替换
- 电脑字母,电脑英文字母大小写怎么转换
- HDU_4585_Shaolin
- Git的诞生_繁星漫天_新浪博客
- 人人车严选店成都首店开业 占地面积1.2万平米
- 基于Docker-compose搭建Redis高可用集群-哨兵模式(Redis-Sentinel)
- 维修服务器bga是什么,服务器主板芯片坏了有机器能拆除焊接BGA吗?
- 微机接口实验一 :8255并行接口实验
- 分享编程技术的微信公众号二维码
- 第一章 信息源泉——推介资料出处
- 【已解决】msaddndr.dll是什么程序?msaddndr.dll官方下载地址在哪?
- 快速傅里叶变换(FFT)板子
- 如何查看物理CPU和逻辑CPU
热门文章
- 打印pdf就一页_PDF 文件转换工具
- openfire消息通知推送_微信小游戏内测「订阅消息」能力,这是召回用户的「大杀器」吗?...
- oracle regr,oracle 分析函数
- 操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装
- pat 乙级 1033 旧键盘打字(C++)
- 同一交换机的不同VLAN如何隔离?
- 【渝粤教育】国家开放大学2018年秋季 3781-22T燃气燃烧技术与设备 参考试题
- 【渝粤教育】国家开放大学2018年春季 0233-21T学前儿童语言教育 参考试题
- 【渝粤题库】国家开放大学2021春1021劳动与社会保障法题目
- php5.6 连接 oracle,XAMPP中PHP5.6.3连接Oracle