多线程
- 进程
是一个正在执行中的程序
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元 - 线程
就是进程中一个独立的控制单元。一个进程中至少有一个线程 - 多线程存在的意义
- 线程的创建方式
- 多线程的特性
JAVA VM启动的时候会有一个进程java.exe
该线程中至少一个线程负责Java程序的执行,而且这个线程运行的代码在Main方法中
该线程称为主线程
垃圾回收也是一个线程
扩展:
更细节说明Jvm,jvm启动不只是一个线程,还有负责垃圾回收机制的线程
如何在自定义代码中自定义一个线程
通过API的查找,java已经提供了对各类食物的描述,就是Thread类
创建线程的第一种方式,继承Thread类
步骤:
1.定义类继承Trhead
2.复写Thread类中的run方法
目的:将自定义的代码存储在run代码中,让线程运行
3.调用线程的start方法
开启线程并执行线程的run方法
发现运行结果每一次都不同,因为多个线程都获取CPU的执行权,CPU执行到谁,谁就运行
明确一点,在某一时刻,只能有一个程序在运行,(多核除外)
CPU在做着快速的切换,以达到看上去同时进行的效果
我们可以形象地把多线程的运程行为在互相抢夺cpu的执行权
这就是多线程的随机性,谁抢到谁执行,至于执行多长时间,cpu说的算
public void run()如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 Thread 的子类应该重写该方法。
public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
该方法有两个作用:启动线程 调用run方法
class Demo extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
for(int i=0;i<=400;i++)
System.out.println("demo run");
}
}
public class ThreadDemo extends Thread{
public static void main(String[] args) {
Demo th=new Demo();
th.start();
for(int i=0;i<=400;i++)
System.out.println("hello main");
}
}
为什么要覆盖run方法?
Thread用于描述线程
该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法
也就是Thread类中的run方法,用于存储线程要运行的代码