一进程、线程概念:

①进程:是正在执行中的程序

         每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫控制单元

线程:是进程中的一个独立的控制单元

          线程控制着进程而定执行

一个进程中至少有一个线程

②jvm启动时会有一个进程java.exe

该进程中至少一个线程负责java程序的执行,而且这个线程运行的代码在main方法中,该线程称为主线程。

扩展:其实更细节说jvm,jvm启动不止一个线程,还有垃圾回收机制的线程

二、如何在自定义的代码中,自定义一个线程呢?

通过对API的查找,java已经提供了对这类事物的描述,就是Thread类

创建线程的第一种方法:继承Thread类

步骤:

1.定义类继承Thread

2.复写Thread类中的run方法

3.创建线程对象,调用线程的start方法

   该方法作用①启动线程②调用run方法

 

 

 

public class Demo extends Thread{
	public void run() {
		for(int i=0;i<10;i++) {
		System.out.println("run demo");
	    }
	}
	
}
public class ThreadDemo {

	public static void main(String[] args) {
		Demo d=new Demo();//创建一个对象,就是创建一个线程
		d.start();//开启线程并知心该线程的run方法
                //d.run(); 仅仅是对象调用方法。而线程创建了,没有运行         
               for(int i=0;i<10;i++) {
			System.out.println("run HelloWorld");
		    }
	}

}
 

 

 

 

 

 

 

 

(42)继承Thread类创建线程_创建线程

输出:交替执行,每次执行结果每次都不同

因为多个线程都在获得cpu的执行使用权。cpu执行到谁,谁就运行。

明确一点,在某个时刻,只能有一个程序在运行(单核)

CPU在做着快速的切换,以达到看到看上去是同时运行的效果,我们可以形象的把多线程的运行行为在互相抢夺cpu的执行权。

这就是多线程的一个特性:随机性。谁抢到谁执行;至于多长时间,cpu说了算

 

图示说明:

main处是主线程,通过创建线程对象,启动run方法,就有了一个新的线程执行路径,就目前情况而言,就有两个执行路径在同时执行。

多个线程抢占CPU资源,每次只能一个线程执行

main主线程可能先执行完,d线程没执行完,这个进程不会结束,直到所有的线程全都执行完,这个进程才结束

当双核出现后,内存出现瓶颈

(42)继承Thread类创建线程_主线程_02

 

为什么要覆盖run方法呢?

Thread类用于描述线程。该类定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。

也就是说,Thread类中的run方法,用于存储线程要运行的代码。

主线程中的代码放在main中,自定义线程的代码放到run方法中

为什么继承Thread类,复写run方法?

目的:将自定义的代码存储在run方法中,让线程运行。

(如果就创建Thread类对象,调用start方法,start默认调用run方法,run中没代码,什么都执行不了。而自定义线程的目的就是要执行指定的代码,父类Thread中已经定义了run方法,所以继承复写即可)