博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中线程的基本操作以及Thread和Runnable两种实现的比较
阅读量:3924 次
发布时间:2019-05-23

本文共 3101 字,大约阅读时间需要 10 分钟。

线程的定义:

某一时间点执行的处理,是操作系统能够进行运算调度的最小单位。一条线程是某一进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

Java中线程的实现:

基于Java虚拟机(JVM,Java Virtual Machine,多学英语,也算是培养专业素养了),这点很重要,帮你们复习一下JVM的运行原理,自己之前看过研究过JVM的一些知识,自己亲手画的运行内存图。

下面是我上传的资料连接,有兴趣的朋友,欢迎下载。

jvm内存分布

代码实现

太多JVM的知识,不太好讲,这里先不说了。下面直接上代码,比较两种方式的实现。。。

eclipse或是其他开发工具的使用我也不介绍了,我是用eclipse开发,其他工具,甚至记事本(扫地僧的级别玩家,膜拜都是可以实现的,确保本地配置好了好了java的运行环境即可。
抱歉,可能部分人会觉的代码比较乱,自己可以分包写,对于简单些的代码,我习惯这样写。

public class Demo2 {	public static void main(String[] args) { // main方法的入口方法		new Thread2_1("线程一").run(); // main线程,线程中调用了其他线程方法		new Thread2_1("线程一").start(); // Thread-1线程, ,并自动调用了run方法		new Thread2_2("线程二").run(); // main线程		new Thread(new Thread2_2("线程二")).start(); // Thread-2线程,并自动调用了run方法	}}class Thread2_1 extends Thread {	private String name;	public Thread2_1(String name) {		name = this.name;	}	public void run() {		for (int i = 0; i < 5; i++) {			System.out.println(Thread.currentThread().getName() + "--extends 实现---Good");		}	}	public void a() {		System.out.println(Thread.currentThread().getName() + "-----其他方法执行了");	}}class Thread2_2 implements Runnable {	private String name;	public Thread2_2(String name) {		name = this.name;	}	@Override	public void run() {		for (int i = 0; i < 5; i++) {			System.out.println(Thread.currentThread().getName() + "--implements 实现---Good");		}	}}

代码分析

程序入口,main方法,定义了线程的启动,比较结果输出

public class Demo2 {	public static void main(String[] args) { // main方法的入口方法		new Thread2_1("线程一").run(); // main线程,线程中调用了其他线程方法		new Thread2_1("线程一").start(); // Thread-1线程, ,并自动调用了run方法		new Thread2_2("线程二").run(); // main线程		new Thread(new Thread2_2("线程二")).start(); // Thread-2线程,并自动调用了run方法	}}

定义Thread2_1线程,extends Thread 方式实现,有参构造,便于命名区分,两个方法用于测试

class Thread2_1 extends Thread {	private String name;	public Thread2_1(String name) {		name = this.name;	}	public void run() {		for (int i = 0; i < 5; i++) {			System.out.println(Thread.currentThread().getName() + "--extends 实现---Good");		}	}	public void a() {		System.out.println(Thread.currentThread().getName() + "-----其他方法执行了");	}}

定义Thread2_2线程,implements runnable 方式,有参构造,便于命名区分

class Thread2_2 implements Runnable {	private String name;	public Thread2_2(String name) {		name = this.name;	}	@Override	public void run() {		for (int i = 0; i < 5; i++) {			System.out.println(Thread.currentThread().getName() + "--implements 实现---Good");		}	}}

输出结果

main--extends 实现---Goodmain--extends 实现---Goodmain--extends 实现---Goodmain--extends 实现---Goodmain--extends 实现---GoodThread-1--extends 实现---GoodThread-1--extends 实现---Goodmain--implements 实现---Goodmain--implements 实现---Goodmain--implements 实现---Goodmain--implements 实现---Goodmain--implements 实现---GoodThread-1--extends 实现---GoodThread-1--extends 实现---GoodThread-1--extends 实现---GoodThread-2--implements 实现---GoodThread-2--implements 实现---GoodThread-2--implements 实现---GoodThread-2--implements 实现---GoodThread-2--implements 实现---Good

是不是和你预期一样?

总结

一、两种方式都是可行的,都是start()方法启动,会自动调用run()方法,但略有区别。

二、线程调用run()方法,不会启动新的线程,就像例子中,还是在main线程中运行的。
三、Thread类和Runnable方法本质上:Thread类底层是实现了Runnable接口,并且持有run方法,但Thread 类的run方法主体是空的,不执行任何操作,Thread类的run方法通常都由run方法重写(@override)。

转载地址:http://qugrn.baihongyu.com/

你可能感兴趣的文章
如何绕过 TPM 2.0 安装 Windows 11 操作系统?
查看>>
为WPF播放GIF伤神不?
查看>>
.NET Core with 微服务 - Elastic APM
查看>>
生产力提升! 自己动手自定义Visual Studio 2019的 类创建模板,制作简易版Vsix安装包...
查看>>
考虑用Task.WhenAll
查看>>
关于面试,避开这几点,成功几率更大~~~
查看>>
堵俊平:开放治理是开源社区的终极之路 | DEV. Together 2021 中国开发者生态峰会...
查看>>
Linux实操--实用指令Day3
查看>>
Linux实操--实用指令Day4
查看>>
Linux实操--实用指令Day3
查看>>
spring+springboot认识
查看>>
Leetcode 136. 只出现一次的数字
查看>>
Leetcode 11. 盛最多水的容器
查看>>
Leetcode 121. 买卖股票的最佳时机
查看>>
Leetcode 123. 买卖股票的最佳时机 III
查看>>
Leetcode 24. 两两交换链表中的节点
查看>>
Leetcode 100. 相同的树
查看>>
Leetcode 101. 对称二叉树
查看>>
Leetcode 108. 将有序数组转换为二叉搜索树
查看>>
Leetcode 303. 区域和检索 - 数组不可变
查看>>