Java - 多线程 Extends Thread实现
Thread类:
Thread类是Java.lang包中的一个类,从这个类中实例化的对象代表线程,启动一个新的现场需要建立Thread实例。
构造方法
Thread的两个常用构造方法:
- public Thread():创建一个新的线程对象。
- public Thread(String threadName):创建一个名为threadName的线程对象。
继承Thread类
继承Thread类创建线程对象
public class ThreadTest extends Thread{
@Override
public void run() {
........
}
}
- run():方法内包含用户所写的线程所要执行的功能代码。当一个类继承Thread后,可在其中覆盖此 方法,调用父类中的 start() 方法执行线程,即run()中的代码。
- run()方法必须使用下列格式:
public void run(){
}
注意:
如果start()调用一个已经启动的线程,系统将会抛出:IllegalThreadStateException异常
启动线程
调用start()即可启动线程并执行run()中的代码
public static void main(String[] args) {
new ThreadTest().start();
}
测试
- 让线程循环打印一个1~10的数字
首先创建PrintNumber类并继承Thread类:
//继承Thread类
class PrintNumber extends Thread{
//重写run()方法
@Override
public void run() {
//编写逻辑代码
for (int i = 0;i <= 10; i++){
System.out.println("i=:"+i);
}
}
}
在main中调用:
public static void main(String[] args) {
//使用构造方法创建一个名为Hello的线程对象并执行start()
new PrintNumber("Hello").start();
}
结果:
i=:0
i=:1
i=:2
i=:3
i=:4
i=:5
i=:6
i=:7
i=:8
i=:9
i=:10
进程已结束,退出代码0
错误实例
- 在run()内调用start()触发错误.
修改run()方法
@Override
public void run() {
for (int i = 0;i <= 10; i++){
System.out.println("i=:"+i);
this.start();//调用start()
}
}
结果:
i=:0
Exception in thread "Hello" java.lang.IllegalThreadStateException
at java.base/java.lang.Thread.start(Thread.java:1534)
at com.xjy.Java.MultiThreading.PrintNumber.run(extendsThread.java:20)
进程已结束,退出代码0
因为start()调用了一个已经启动的线程,所以抛出了IllegalThreadStateException异常
注意:
需要注意以下几点:
- 线程在没有调用start()之前不会启动,在主方法没有调用start()时,Thread对象只是一个实例,而不是一个真正的线程。
- start()调用一个已经启动的线程会抛出IllegalThreadStateException异常。