一、概念开始:
1、进程:
(1)直译:正在进行中的程序
(2)解释:执行一个程序时,会在内存中为程序开辟空间,这个空间就是一个进程。
(3)注意:一个进程中不可能没有线程,进程只是开辟一个空间,并不执行,执行的是线程。
2、线程:
(1)定义:就是进程中一个负责执行的控制单元(执行路径)
(2)注意:一个进程中可以有多个执行路径,成为多线程;一个进程中至少有一个线程
3、任务:
开启多个线程,是为了同时运行多个内容,这个内容就是任务
二、多线程的初步认识
jvm(java虚拟机)中的多线程解析:jvm启动时,就启动了多线程。其中至少有两个线程,执行main函数的主线程和负责垃圾回收的线程
解释:在执行main函数中任务的时候,会开启一条线程,当运行垃圾越来越多,又会有垃圾回收任务,所以垃圾回收线程开启。其中,main方法任务的代码都定义主函数代码中。
三、线程的创建
1、继承Thread类创建多线程
(1)创建类继承Thread类
(2)覆盖Thread类中的run()方法,将线程任务封装到run中
代码实例:
publicclass ThreadDemo2 extends Thread {
//覆盖父类的run方法
publicvoid run() {
//运行任务
show();
}
public void show() {
for(inti=1;i<10;i++){
System.out.println(i+super.getName());
}
}
}
//调用
Threadthread = new ThreadDemo2();
Threadthread2 = new ThreadDemo2();
thread.start();
thread2.start();
2、实现Runnable接口创建多线程
(1)定义Runnable类实现接口
(2)覆盖Runnable接口中run()方法,将线程的任务封装到run中
(3)通过Thread类创建线程对象,并将接口的子类对象作为Runnable类的构造函数进行传递
(4)调用线程对象的start方法开启线程
注意:为什么要有(3)步骤呢?因为,线程的任务都是封装在Runnable接口子类对象的run()方法中。
代码实例:
publicclass RunnableDemo implements Runnable{
@Override
publicvoid run() {
show();
}
publicstaticvoid show(){
System.out.println("1");
}
}
调用:
RunnableDemorunnableDemo = new RunnableDemo();
Threadthread3 = new Thread(runnableDemo);
Threadthread4 = new Thread(runnableDemo);
thread3.start();
thread4.start();
四、多线程的生命周期
1、新建状态:使用new创建一个线程后,在调用start方法前,该线程只是一个空线程,只具备的一些特性,系统还未为其分配资源
2、就绪状态:调用start()方法后,系统为其分配除cpu之外的所需资源。此外,当处于运行时的线程调用了yield()方法,那么该线程会被暂时剥夺cpu资源,重新进入就绪状态
3、运行状态:Java运行系统通过调度选中一个处于就绪状态的线程,使其占有CPU并转为运行状态。此时,系统真正执行线程的run()方法。可以通过Thread类的isAlive方法来判断线程是否处于就绪/运行状态:当线程处于就绪/运行状态时,isAlive返回true,当isAlive返回false时,可能线程处于阻塞状态,也可能处于停止状态。
4、阻塞状态:一个正在运行的线程因某些原因不能继续运行时,就进入阻塞状态。
这些原因包括:
1)当执行了某个线程对象的sleep()等阻塞类型的方法时,该线程对象会被置入一个阻塞集内,等待超时而自动苏醒。
2)当多个线程试图进入某个同步区域时,没能进入该同步区域的线程会被置入锁定集,直到获得该同步区域的锁,进入就绪状态。
3)当线程执行了某个对象的wait()方法时,线程会被置入该对象的等待集中,直到执行了该对象的notify()方法wait()/notify()方法的执行要求线程首先获得该对象的锁。
5、死亡状态:线程在执行完run()方法后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态
注:终止线程的三种方法:
1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止,推荐使用
2)使用stop方法强制终止线程(这个方法不推荐使用,因为stop和suppend、resume一样,也可能发生不可预料的结果)
3)使用interrupt方法终端线程