线程的概念
线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程,也可以有多个线程
线程的创建
一、创建线程的方法:
:::
第一种方法:编写一个类,并且继承java.lang.Thread类,重写run( )方法
public class MyFirstThread extends Thread {
@Override
public void run() {
System.out.println("这是分支线程---------");
}
}
- 在main方法中 new出创建的线程,调用start( )方法,就启动了一个线程
- start( )方法的作用是在jvm中开辟新的栈空间
- 启动成功的线程,会自动调用run( )方法,并且run( )在分支栈的栈底部,run( )方法和main( )方法是平级的,都在各自栈的底层(压栈)
- 第二种方法:编写一个类,实现java.lang.Runnable接口,实现run( )方法
class MySecondThread implements Runnable{
@Override
public void run() {
System.out.println("这是第二个分支线程---------");
}
}
- 这个创建出来的类,并不是一个线程!最多是一个可运行的类!
- 在main方法中,创建可运行的对象
- 将可运行的对象传进 Thread( )的有参构造中创建线程对象
建议: 使用第二种方法创建线程对象,因为Java只支持单继承,却能实现多个接口。
第三种方法:使用匿名内部类创建线程对象
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("这是第三个分支线程---------");
}
}).start();
二、线程在内存中的运行状态
:::
运行线程的start( )方法时,线程在内存中的状态
线程的生命周期
一、线程的五个状态
:::
- 新建状态——>new出来
- 就绪状态——>调用start( )方法、解除阻塞事件
- 运行状态——>run( )方法开始执行
- 阻塞状态——>遇到阻塞事件
-
二、流程图(没加方法)
:::
就绪状态:就绪状态的线程又叫做可运行状态,表示当前线程具有抢夺CPU时间片的权利(CPU时间片就是执行权)。当一个线程抢夺到CPU时间片之后,就开始执行run( )方法。
- 运行状态:run( )方法执行,标志着线程进入运行状态,当之前占有的CPU时间片用完后,线程会重新回到就绪状态继续抢夺cpu时间片,当再次抢到puc时间片时,就重新进入run( )方法接着上一次的代码继续往下执行。
- 阻塞状态:当一个线程遇到阻塞事件(例如用户输入),或者sleep( )方法时,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的CPU时间片。当阻塞状态解除时,线程会重新回到就绪状态继续抢夺CPU时间片。
线程状态控制
一、启动线程start( )
:::