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();
}
}