源码先锋

源码先锋

线程

admin 185 191

1主线程和子线程概述

什么是主线程

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

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

主线程的执行路径

从main开始直到main结束

什么是子线程

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

子线程的执行路径

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

2线程的运行模式

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

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

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

3Thread类常用方法

Thread类常用方法

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

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

voidsetName(Stringname);修改线程名称

staticvoidsleep(longmillis);让线程休眠指定的毫秒值

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

示例

publicclassThreadDemo{
publicstaticvoidmain(String[]args){
//创建子线程对象
MyThreadt=newMyThread();
//修改线程名称
("A线程");
//获得线程名称
(());
//开启线程
();
try{
//让当前线程休眠1秒
(1000);
}catch(InterruptedExceptione){
();
}
for(inti=0;i6;i++){
("main="+i);
}
}
publicstaticvoidtest(){
//获得主线程对象
Threadmt=();
//获得主线程名称
(());
}
}

4创建线程方式二

/**

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

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

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

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

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

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

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

*/

publicclassThreadDemo01{
publicstaticvoidmain(String[]args){
//开启线程的方式2:实现Runnable接口
//创建Runnable接口的实现类对象
MyRunnabletarget=newMyRunnable();
//创建Thread类对象
Threadt1=newThread();
Threadt2=newThread();
//开启线程,会触发run方法的调用
();
();
//开启线程的方式1:继承Thread
MyThreadt3=newMyThread();
MyThreadt4=newMyThread();
();
();
}
}

5实现Runnable的好处

避免了Java单继承的局限性

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

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

为线程池提供前提条件

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

/**

匿名内部类的语法

new类名或接口名(){

//重写方法

}

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

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

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

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

*/

publicclassThreadDemo02{
publicstaticvoidmain(String[]args){
//创建线程对象:使用匿名内部类
//直接创建Thread类的子类对象,并调用start方法开启线程
newThread(){
@Override
publicvoidrun(){
("子线程的任务="+getName());
}
}.start();
//创建线程对象:使用匿名内部类
//直接创建Runnable接口的实现类对象
Runnabletarget=newRunnable(){
@Override
publicvoidrun(){
("子线程的任务="+().getName());
}
};
//根据实现类对象创建线程对象
Threadt=newThread(target);
();
//简化
newThread(newRunnable(){
@Override
publicvoidrun(){
("子线程的任务="+().getName());
}
}).start();
}
}