进程:是一个正在执行中的程序。
每一个进程执行都有一个执行顺序。该顺序是一个执行路径。或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元。
线程在控制着进程的执行。
注意:一个进程中至少有一个线程。
JVM 启动的时候会有一个进程 java.exe.
该进程中至少有一个线程负责java程序的执行。而且这个线程运行的代码存在于main方法中。该线程称为主线程。
扩展:其实更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程。
1、如何在自定义的代码中,定义一个线程?
通过对api的查找,java已经提供了对线程这类事物的描述,就Thread类。
创建线程的第一种方法:继承Thread类。(必须在子类中重写Thread中的run()方法)
步骤:
执行结果为:xiancheng run---01、定义类继承Thread.
2、复写Thread类中的run方法(目的:将自定义的代码存储在run运行方法,让线程)。
3、用new方式,创建一个线程。
3、调用线程的start方法,该方法有两个作用:(1、启动线程2、调用run方法。)
public class Demo54 { public static void main(String args[]){ Xiancheng aa=new Xiancheng();//创建好一个线程 aa.start();//启动一个线程 } } class Xiancheng extends Thread{ public void run(){ for(int i=0;i<20;i++){ System.out.println("xiancheng run--"+i); } } }
xiancheng run---1xiancheng run---2xiancheng run---3xiancheng run---4xiancheng run---5xiancheng run---6xiancheng run---7xiancheng run---8xiancheng run---9xiancheng run---10xiancheng run---11xiancheng run---12xiancheng run---13xiancheng run---14xiancheng run---15xiancheng run---16xiancheng run---17xiancheng run---18xiancheng run---19xiancheng run---20
多线程实例:在某一时刻,cpu只能执行一个进程。
public class Demo54 {
public static void main(String args[]){
Xiancheng aa=new Xiancheng();//创建好一个线程
aa.start();//启动一个线程
for(int x=0;x<50;x++){ //主线程先执行
System.out.println("hello,world---"+x);
}
}
}
class Xiancheng extends Thread{
public void run(){
for(int i=0;i<50;i++){
System.out.println("xiancheng run---"+i);
}
}
}
执行结果:
hello,world---0xiancheng run---0xiancheng run---1xiancheng run---2xiancheng run---3hello,world---1xiancheng run---4hello,world---2xiancheng run---5hello,world---3xiancheng run---6xiancheng run---7hello,world---4hello,world---5hello,world---6hello,world---7hello,world---8hello,world---9hello,world---10hello,world---11hello,world---12hello,world---13hello,world---14hello,world---15hello,world---16hello,world---17hello,world---18hello,world---19hello,world---20xiancheng run---8xiancheng run---9xiancheng run---10xiancheng run---11xiancheng run---12xiancheng run---13xiancheng run---14xiancheng run---15xiancheng run---16xiancheng run---17xiancheng run---18xiancheng run---19xiancheng run---20xiancheng run---21xiancheng run---22xiancheng run---23xiancheng run---24xiancheng run---25xiancheng run---26xiancheng run---27xiancheng run---28xiancheng run---29xiancheng run---30xiancheng run---31xiancheng run---32xiancheng run---33xiancheng run---34xiancheng run---35xiancheng run---36xiancheng run---37xiancheng run---38xiancheng run---39xiancheng run---40xiancheng run---41xiancheng run---42xiancheng run---43xiancheng run---44xiancheng run---45xiancheng run---46xiancheng run---47xiancheng run---48xiancheng run---49hello,world---21hello,world---22hello,world---23hello,world---24hello,world---25hello,world---26hello,world---27hello,world---28hello,world---29hello,world---30hello,world---31hello,world---32hello,world---33hello,world---34hello,world---35hello,world---36hello,world---37hello,world---38hello,world---39hello,world---40hello,world---41hello,world---42hello,world---43hello,world---44hello,world---45hello,world---46hello,world---47hello,world---48
hello,world---49
结果发现,运行结果每一次都不同,因为多线程都获取cpu的执行权,cpu执行到谁,谁就运行。明确一点,在某一时刻,只能有一个程序在运行。(多核除外,多核也即是有多个cpu),cpu在做着快速的切换,以达到看上去是同时运行的效果。
可以形象的把多线程的运行行为看做为在互相抢夺cpu的执行权。
这就是多线程的一个特性:随机性。(谁抢到谁执行,至于执行多长时间,cpu说了算。)
为什么要覆盖run方法呢?
Thread类用于描述线程。
该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。
也就是说Thread类中的run方法,用于存储线程要运行的代码。
Demo d=new Demo();//创建好一个线程
d.start();//开启线程并执行该线程的run方法
Demo d=new Demo();//创建好一个线程
d.run();//仅仅是对象调用方法,而线程创建了,并没有运行