进程是正在执行的程序,每一个进程执行都有一个执行的顺序,该顺序就是一个执行路径,或者一个控制单元,启动分配内存空间,进程定义表示空间封装里面的控制单元,线程是进程中的真正执行部分,一个独立的控制单元,线程控制着进程的执行,一个进程至少包含一个线程。
cpu对进程的执行如下图
java api中存在了一个现成的thread,如果我们生成新的线程也可以继承该thread那么我们就得到了新的线程类
class Demo extennds Thread{
public void run(){
System.out.println(“Demo run”)
}
}
我们得到了一个新的线程类,那么利用该新的线程类我们便可以创建一个实体线程对象
class ThreadDemo{
public static void main(String [] args)
{
Demo d=new Demo();
p.start();//虚拟机调用该线程的run方法 1、启动线程(执行) 2、(执行谁?)调run方法
}
}
main线程与Demo线程交替运行的代码示例
package execisetest;
class Demo extends Thread{
public void run(){
for(int i=0;i<60;i++){
System.out.println("demo run");
}
}
}
public class DemoThread{
public static void main(String [] args){
Demo d=new Demo();
d.start();
for(int i=0;i<60;i++){
System.out.println("hello word");
}
}
}
每次运行结果不同,多个线程都在获取cpu的执行权,谁得到谁就运行。cpu在做着快速切换,已达到看上去同时运行的效果。
为什么覆盖run方法?
Thread类描述线程,run方法存储要运行的代码,开启线程是为了执行某些代码,但是每个线程要运行的代码不一样,所有run方法也不一样。
如果将d.start()改为d.run()则并不会开启线程,虽然已经创建了线程,这样的调用和普通调用一样,而不是多线程同时运行。