一进程、线程概念:
①进程:是正在执行中的程序
每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫控制单元
线程:是进程中的一个独立的控制单元
线程控制着进程而定执行
一个进程中至少有一个线程
②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"); } } }
输出:交替执行,每次执行结果每次都不同
因为多个线程都在获得cpu的执行使用权。cpu执行到谁,谁就运行。
明确一点,在某个时刻,只能有一个程序在运行(单核)
CPU在做着快速的切换,以达到看到看上去是同时运行的效果,我们可以形象的把多线程的运行行为在互相抢夺cpu的执行权。
这就是多线程的一个特性:随机性。谁抢到谁执行;至于多长时间,cpu说了算
图示说明:
main处是主线程,通过创建线程对象,启动run方法,就有了一个新的线程执行路径,就目前情况而言,就有两个执行路径在同时执行。
多个线程抢占CPU资源,每次只能一个线程执行
main主线程可能先执行完,d线程没执行完,这个进程不会结束,直到所有的线程全都执行完,这个进程才结束
当双核出现后,内存出现瓶颈
为什么要覆盖run方法呢?
Thread类用于描述线程。该类定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。
也就是说,Thread类中的run方法,用于存储线程要运行的代码。
主线程中的代码放在main中,自定义线程的代码放到run方法中
为什么继承Thread类,复写run方法?
目的:将自定义的代码存储在run方法中,让线程运行。
(如果就创建Thread类对象,调用start方法,start默认调用run方法,run中没代码,什么都执行不了。而自定义线程的目的就是要执行指定的代码,父类Thread中已经定义了run方法,所以继承复写即可)