线程的创建和使用
创建线程
Java语言的JVM允许程序运行多个线程,它使用java.lang.Thread
类来实现
Thread类的特性:
- 每个线程都是通过某个特定Thread对象的
run()
方法来完成操作的,经常把run()
方法的主体叫做线程体 - 通过该Thread对象的
start()
方法来启动这个线程,而不是使用run()
/**
* 创建多线程:方式一:继承Thread类
* @author hsy
* @date 2022/12/19
*/
class myThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2==0){
System.out.println(i);
}
}
}
}
public class ThreadTest {
public static void main(String[] args) {
myThread t1 = new myThread();
t1.start();
}
}
/**
* 创建多线程:方式二:实现Runnable接口
* @author hsy
* @date 2022/12/19
*/
class MThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2==0){
System.out.println(i);
}
}
}
}
public class ThreadTest1 {
public static void main(String[] args) {
MThread mThread = new MThread();
new Thread(mThread).start();
}
}
srart()
方法有两个作用:一是启动当前的线程,二是调用当前线程的run()
方法
注意:不能通过调用对象的run方法启动线程,这样做相当于在主线程中调用方法,没用开启新的线程。当需要建立多个线程的时候,需要new多个线程的对象,不能多次调用start方法,一个线程只能调用一次start方法
两种创建方式比较:
开发中:优先选择实现Runnable接口的方式
原因:1. 实现的方法没有类的单继承性的局限性
2.实现的方式更适合来处理多个线程共享数据的情况
相同点:两种方式都需要重写run方法,将线程要执行的逻辑声明在run方法中
线程的分类
Java中的线程分为两类:守护线程和用户线程
- 这两个在每个方面几乎相同,唯一区别是判断JVM何时离开
- 守护线程是用来服务用户的线程,通过在
start()
方法前调用thread.setDaemon(true)
可以把一个2用户线程变成一个守护线程 - Java垃圾回收机制就是一个守护线程
- 若JVM中都是守护线程,当前JVM退出
线程的常用方法
void srart():启动线程,并执行对象的run()方法
run():线程在调度时执行的操作
String getName():返回线程的名字
void setName(String Name):设置该线程的名字
static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
yield():释放当前cpu的执行权
join():在线程a中调用线程b的join方法,此时线程a就进入阻塞状态,直到线程b完全执行完之后,线程a才结束阻塞状态
sleep(long millitime):让当前线程睡眠指定的milltime毫秒,在指定的millitime毫秒时间内,当前线程是阻塞状态
isAlive():判断当前线程是否存活
线程的调度
- 调度策略
- Java的调度方法
线程的优先级
- 线程的优先等级
- MAX_PRIORITY:10
- MIN_PRIORITY:1
- NORM_PRIORITY:5
- 涉及的方法
- getPriority():返回线程优先值
- setPriority(int new Priority):改变线程的优先级
- 说明
- 线程创建时继承父类的优先级
- 低优先级只是获得调度的可能性很低,并非一定是在高优先级线程调度之后才被调用