进程:
进程是一个正在执行中的程序,每一个进程都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元
线程:
就是进程中的一个独立的控制单元。线程控制着进程的执行,另外一个进程中至少有一个线程
主线程:
java虚拟机启动的时候会有一个进程java.exe。该进程中至少一个线程负责java程序的执行。而且这个线程运行的代码存在与main方法中
创建多线程:
1.继承thread类
①定义类继承Thread
②复写Thread类中的run方法
③调用线程的start方法(该方法有两个作用:启动线程,调用run方法)
我们多次执行上面的代码发现每一次的运行结果都不相同。这是因为多个线程都会获取cpu的执行权。cpu执行到谁, 谁就运行。在某一时刻,只能有一个程序运行(多核除外)。cpu在做快速的切换,以达到看上去是同时运行的效果。我们可以形象的把多线程的运行看做 是相互抢夺cpu的执行权
这就是多线程的一个特性:随机性
至于上图为什么要覆盖run方法呢?
thread类用于描述进程,该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法。也就是说thread类中的run方法,用于存储线程要运行的代码
线程的生命周期:
1. 新建状态,当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值
2. 就绪状态,当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
3. 运行状态,如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
4. 阻塞状态,当处于运行状态的线程失去所占用资源之后,便进入阻塞状态。阻塞状态又分为以下三种
等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5 消亡状态
自定义线程名称:
实际上,线程默认名称从 Thread0开始逐步递增,当然我们也可以自定义线程名称
static Thread currentThread() 获取当前线程对象
getName() 获取线程名称
设置线程名称:setName或者构造函数
网友评论