线程创建方式1:继承Thread类
概述
- Java语言的JVM允许程序运行多个线程,使用
java.lang.Thread
类代表线程,所有的线程对象都必须是Thread类或其子类的实例。 - Thread类的特性
- 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为
线程执行体
。 - 通过该Thread对象的start()方法来启动这个线程,而非直接调用run()。
- 要想实现多线程,必须在主线程中创建新的线程对象。
- 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,因此把run()方法体称为
方式1:继承Thread类
Java通过继承Thread类来创建并启动多线程的步骤如下:
- 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务
- 创建Thread子类的实例,即创建了线程对象
- 调用线程对象的start()方法来启动该线程
1. 线程的创建方式一:继承Thread类
1.1 步骤:
(1)创建一个继承于Thread类的子类
(2)重写Thread类的run()方法--->将此线程要执行的操作,声明在方法体中
(3)创建当前Thread的子类的对象
(4)通过对象调用start()方法
start()方法作用:1.启动线程 2.调用当前线程的run()方法
package thread.demo01;
//例题:创建一个分线程1,用于遍历100以内的偶数
public class EvenNumberTest {
public static void main(String[] args) {
//(3)创建当前Thread的子类的对象
PrintNumber t1 = new PrintNumber();
//(4)通过对象调用start()方法
t1.start();
//运行了结果看起来和在main()方法中执行的结果一样,看不出来什么新线程。一起运行试试
//main()所在的线程执行的操作:
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0){
//System.out.println(i + "**********");
//一起运行后查看结果发现出现了交互现象,比如
/*
56
30**********
58
*/
//说明两个线程在交替执行
System.out.println(Thread.currentThread().getName() + ":" + i + "**********" );//直观一点看,直接显示线程名
//运行结果举例:
/*
main:4**********
Thread-0:20
main:6**********
*/
}
}
/*
问题1:能否使用t1.run()替换t1.start()的调用,实现分线程的创建和调用?答:不能。
*/
//t1.run();//相当于主线程中调了一个普通的run()方法
/*
问题2:再提供一个分线程,遍历100以内的偶数。
注意:不能让已经start()的线程,再次执行start(),否则报异常IllegalThreadStateException(非法线程状态)
*/
// t1.start();
//可以重新建一个对象,再次调用start()
PrintNumber t2 = new PrintNumber();
t2.start();
}
}
//(1)创建一个继承于Thread类的子类
class PrintNumber extends Thread {
//(2)重写Thread类的run()方法--->将此线程要执行的操作,声明在方法体中
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
}
练习:创建两个分线程,其中一个线程遍历100以内的偶数,另一个线程遍历100以内的奇数。
package thread.demo01.exercise1;
public class PrintNumberTest {
public static void main(String[] args) { //main()主线程
//方式1:
// Even t1 = new Even();
// Odd t2 = new Odd();
// t1.start();
// t2.start();
//方式2:创建Thread类的匿名子类的匿名对象。
new Thread(){ //偶数
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ": ---- " + i);
}
}
}
}.start();
new Thread(){ //奇数
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
}.start();
}
}
class Even extends Thread{ //用于打印偶数
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ": ---- " + i);
}
}
}
}
class Odd extends Thread{ //用于打印奇数
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
if (i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
}