深入理解线程:从概念到实践

发表时间: 2024-05-31 20:32

1主线程和子线程概述

什么是主线程

程序启动过程中由系统自动创建并执行main方法的线程则称为主线程

在Java程序中,启动时会创建两个线程,一个是主线程,一个是垃圾回收器线程(后台线程)

主线程的执行路径

从main开始直到main结束

什么是子线程

除了主线程以外的所以线程都称为子线程

子线程的执行路径

从run方法开始直到run方法结束

2线程的运行模式

分时式模式:每个线程平均分配CPU使用权,每一个线程使用CPU的时间是相同的

抢占式模式:优先高的线程抢到CPU的概率高点,如果优先级相同,则所有线程一起去抢夺CPU

哪个线程抢到CPU使用权,就执行哪个线程的任务。Java程序的线程运行模式属于该种模式

3Thread类常用方法

Thread类常用方法

String getName() 获得线程名称,默认命名:Thread-序号

static Thread currentThread() 获得当前方法执行所在的线程对象

void setName(String name); 修改线程名称

static void sleep(long millis); 让线程休眠指定的毫秒值

void start() 开辟新的执行路径,在新的路径中执行run方法

示例

public class ThreadDemo {
public static void main(String[] args) {
// 创建子线程对象
MyThread t = new MyThread();
// 修改线程名称
t.setName("A线程");
// 获得线程名称
System.out.println(t.getName());
// 开启线程
t.start();
try {
// 让当前线程休眠1秒
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
for(int i = 0;i < 6;i ++){
System.
out.println("main = " + i);
}
}
public static void test(){
// 获得主线程对象
Thread mt = Thread.currentThread();
// 获得主线程名称
System.out.println(mt.getName());
}
}

4创建线程方式二

/**

开启线程的方式1:继承Thread

创建类继承Thread,重写run方法:将线程任务相关的代码写在该方法中

创建子类对象,调用start方法开启线程

开启线程的方式2:实现Runnable接口

创建一个类实现Runnable接口,重写run方法:将线程任务相关的代码写在该方法中

创建接口实现类对象,根据实现类对象创建Thread对象

调用线程对象的start方法开启线程:会在新的路径中执行实现类对象的run方法

*/

public class ThreadDemo01 {
public static void main(String[] args){
// 开启线程的方式2:实现Runnable接口
// 创建Runnable接口的实现类对象
MyRunnable target = new MyRunnable();
// 创建Thread类对象
Thread t1 = new Thread();
Thread t2 =
new Thread();
// 开启线程,会触发run方法的调用
t1.start();
t2.start();
// 开启线程的方式1:继承Thread
MyThread t3 = new MyThread();
MyThread t4 =
new MyThread();
t3.start();
t4.start();
}
}

5实现Runnable的好处

避免了Java单继承的局限性

可以更好的在多个线程之间共享数据

将线程和任务进行分离,降低了程序的耦合性

为线程池提供前提条件

6匿名内部类方式实现线程的创建

/**

匿名内部类的语法

new 类名或接口名(){

// 重写方法

}

1:直接创建已知类的子类对象

2:直接创建已知接口的实现类对象

什么时候使用匿名内部类创建线程

如果任务只需要执行一次并且任务代码量比较少时,可以考虑使用匿名内部类。

*/

public class ThreadDemo02 {
public static void main(String[] args){
// 创建线程对象:使用匿名内部类
// 直接创建Thread类的子类对象,并调用start方法开启线程
new Thread(){
@Override
public void run() {
System.
out.println("子线程的任务 = " + getName());
}
}.start();
// 创建线程对象:使用匿名内部类
// 直接创建Runnable接口的实现类对象
Runnable target = new Runnable(){
@Override
public void run() {
System.
out.println("子线程的任务 = " + Thread.currentThread().getName() );
}
};
// 根据实现类对象创建线程对象
Thread t = new Thread(target);
t.start();
// 简化
new Thread(new Runnable() {
@Override
public void run() {
System.
out.println("子线程的任务 = " + Thread.currentThread().getName() );
}
}).start();
}
}