Java提供了三种实现多线程的方式,分别是继承java.lang.Thread类实现,通过java.lang.Runnable接口实现以及通过Callable和Future创建线程。
一、继承Thread类覆写run()方法实现多线程
1、继承Thread类覆写run()方法实现多线程的步骤
Thread类是java.lang包中的一个类,Thread类的对象用来代表线程,通过继承Thread类创建,启动并执行一个线程的步骤如下:
-
创建一个继承Thread类的子类;
-
覆写Thread类的run()方法;
-
创建线程类的一个对象;
-
通过线程类的对象调用start()方法启动线程(启动之后会自动调用覆写的run()方法执行线程)。下面详细介绍这四个步骤:
(1)创建一个继承Thread类的子类
Thread类的两个构造方法如下:
- public Thread():创建一个新的线程。
- public Thread(String threadName):创建一个名称为 threadName的线程对象
语法如下:
public class ThreadTest extends Thread{
//code
private int count = 10;
}
创建新线程之后,如果需要操纵创建好的新线程,那么需要使用 Thread类提供的方法,Thread类的常用方法如表:
修饰符/类型 | 方法 | 描述 |
---|---|---|
void | interrupt() | 中断线程。 |
void | join() | 等待该线程终止。 |
void | join(long millis) | 等待该线程终止的时间最长为 millis 毫秒 。 |
void | run() | 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
static void | sleep(long millis) | 在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
static void | sleep(long millis, int nanos) | 在指定的毫秒数加指定的纳秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
void | start() | 使该线程开始执行;Java 虚拟机调用该线的 run 方法。 |
static void | yield() | 暂停当前正在执行的线程对象,并执行其他线程。 |
更多Thread方法请查看多线程(Thread类和Runnable接口详述)中的Thread类部分内容。
(2)覆写Thread类的run()方法
当继承一个Thread类之后,就在线程类中重写run()方法,并将实现线程功能的代码写入run()方法中,然后调用Thread类的start()放方法启动线程,线程启动中以后就会自动调用覆写的run()方法执行线程。
Thread类对象需要一个任务来执行,任务是指线程在启动之后执行的工作,任务的代码写在run()中。run()方法必须使用如下语法格式进行覆写:
public void run(){
//code
}
(3)创建线程类的一个对象
在main主方法中使用如下语法创建线程对象:
public static void main(String[] args){
ThreadTest test = new ThreadTest();
}
(4)启动线程
Java虚拟机调用Java程序的main方法时,就启动了主线程。如果我们想要启动其他程序,那么需要通过线程类对象调用start()方法来实现:
public static void main(String[] args){
ThreadTest test = new ThreadTest(); //创建线程对象
test.start(); //启动线程
}
⚠️注意:如果start()方法调用一个已经启动的线程,系统将抛出IllegalThreadException异常。
2、继承Thread类实现多线程的应用
实例1:继承Thread类,覆写run()方法创建并启动线程
public class ThreadTest extends Thread{
private int count = 10;
@Override
public void run(){
while(true){
//使count变量自减,当自减为0时,退出循环
System.out.println(count+" ");
if(--count == 0){
break;
}
}
}
public static void main(String[] args){
ThreadTest test = new ThreadTest();
test.start();
}
}
Console:
10
9
8
7
6
5
4
3
2
1
实例2:继承Thread类创建多线程并启动多线程
创建一个多线程,包括听音乐和吃饭,并编写主线程调用start()方法启动线程。
- 线程1:听音乐
import java.util.Date;
class ListenThread extends Thread {
@Override
public