线程的定义:

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

Java中线程的实现:

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

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

Java虚拟机原理规范

代码实现

太多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 实现---Good
main--extends 实现---Good
main--extends 实现---Good
main--extends 实现---Good
main--extends 实现---Good
Thread-1--extends 实现---Good
Thread-1--extends 实现---Good
main--implements 实现---Good
main--implements 实现---Good
main--implements 实现---Good
main--implements 实现---Good
main--implements 实现---Good
Thread-1--extends 实现---Good
Thread-1--extends 实现---Good
Thread-1--extends 实现---Good
Thread-2--implements 实现---Good
Thread-2--implements 实现---Good
Thread-2--implements 实现---Good
Thread-2--implements 实现---Good
Thread-2--implements 实现---Good

是不是和你预期一样?

总结

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