Java 线程创建与启动实战解析:Thread类与run方法重写
一、原题完整代码呈现
以下是计算机二级Java考试中关于线程创建、启动及异常处理的典型题型,主要考察线程类继承、线程启动方法、构造方法调用、线程执行体及异常捕获,包含5处需要填写的空白(标记为//*********Found**********
):
public class Java_2
{
public static void main(String[] args)
{
Thread t = new SimpleThread("Testing_Thread");
//*********Found**********
______________ ;
}
}
//*********Found**********
class SimpleThread extends _________
{
public SimpleThread(String str)
{
//*********Found**********
_____________ ;
}
//*********Found**********
public void _________()
{
System.out.println("Running the " + getName() + ":");
for (int i = 0; i < 5; i++)
{
System.out.println("---" + i + "---" + getName());
try
{
sleep((int)(2 * 100));
}
//*********Found**********
_________(InterruptedException e)
}
}
}
二、空白处逐一解析与解答
1. 第一处空白:启动线程
答案:t.start()
//*********Found**********
t.start();
解析:
创建线程对象后,需调用start()
方法启动线程(JVM会自动调用线程的run()
方法,实现并发执行)。直接调用run()
方法会被当作普通方法执行,无法实现多线程,因此填写t.start()
。
2. 第二处空白:线程类继承的父类
答案:Thread
//*********Found**********
class SimpleThread extends Thread
解析:
创建线程的常用方式之一是继承Thread
类(线程基类),并重写其run()
方法作为线程执行体。SimpleThread
作为自定义线程类,需继承Thread
以获得线程功能,因此填写Thread
。
3. 第三处空白:调用父类构造方法初始化线程名
答案:super(str)
//*********Found**********
super(str);
解析: Thread
类有一个接收字符串参数的构造方法(Thread(String name)
),用于设置线程名称。SimpleThread
的构造方法参数str
是线程名,需通过super(str)
调用父类构造方法完成初始化,因此填写super(str)
。
4. 第四处空白:重写线程执行体方法
答案:run
//*********Found**********
public void run()
解析: run()
方法是Thread
类的核心方法,包含线程的执行逻辑(线程启动后实际运行的代码)。自定义线程类必须重写run()
方法以定义具体任务,因此填写run
。
5. 第五处空白:捕获线程休眠异常
答案:catch
//*********Found**********
catch(InterruptedException e)
解析: Thread.sleep(long millis)
方法可能抛出InterruptedException
(当线程休眠被中断时),属于受检异常,必须处理。try
块后需用catch
块捕获该异常,因此填写catch
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过继承Thread
类创建并启动线程,核心功能包括:
- 定义
SimpleThread
类继承Thread
,重写run()
方法(线程执行体) - 在
run()
方法中循环5次,打印计数和线程名,每次循环休眠200毫秒 main
方法创建SimpleThread
实例(线程名“Testing_Thread”)并启动线程
运行说明
- 线程启动:
main
方法中t.start()
启动线程,JVM自动调用SimpleThread
的run()
方法 执行过程:
- 打印线程启动信息:
Running the Testing_Thread:
- 循环5次,每次打印格式为
---计数---线程名
(如---0---Testing_Thread
) - 每次循环后线程休眠200毫秒(模拟耗时操作)
- 打印线程启动信息:
输出结果:
Running the Testing_Thread: ---0---Testing_Thread ---1---Testing_Thread ---2---Testing_Thread ---3---Testing_Thread ---4---Testing_Thread
五、核心知识点总结
线程创建的核心:继承Thread类
步骤:
- 自定义类继承
Thread
类(class SimpleThread extends Thread
) - 重写
run()
方法(线程执行体,定义线程任务) - 创建线程对象(
new SimpleThread(...)
) - 调用
start()
方法启动线程(而非直接调用run()
)
- 自定义类继承
- 关键:
start()
方法是线程启动的唯一入口,会触发JVM创建新线程并执行run()
Thread类的核心方法与构造
- 构造方法:
Thread(String name)
通过字符串参数设置线程名,可通过getName()
获取 run()
:线程执行体,必须重写以定义具体逻辑start()
:启动线程,使线程进入就绪状态,等待CPU调度sleep(long millis)
:使当前线程休眠指定毫秒数(静态方法),可能抛出InterruptedException
- 构造方法:
异常处理:InterruptedException
- 触发场景:当线程在休眠(
sleep
)、等待(wait
)等状态时被中断(如调用interrupt()
方法) - 处理要求:受检异常,必须通过
try-catch
捕获或throws
声明,否则编译错误 - 本题简化处理:
catch
块为空,实际开发中可添加中断处理逻辑(如日志记录)
- 触发场景:当线程在休眠(
线程与普通方法的区别
- 线程启动:
start()
方法创建新线程,与主线程并发执行 - 普通调用:直接调用
run()
方法仅作为主线程中的普通方法执行,无并发效果 - 示例:若将
t.start()
改为t.run()
,输出结果相同但无多线程特性(本质是主线程执行run()
)
- 线程启动:
六、常见错误与应试技巧
常见错误分析
- 第一处空白启动方法错误:写成
t.run()
(普通方法调用,无多线程)或start(t)
(语法错误,start()
是实例方法) - 第二处空白继承类错误:写成
Runnable
(接口,需用implements
而非extends
)或拼写错误(如Thred
) - 第三处空白构造调用错误:写成
this(str)
(调用本类构造,未初始化父类线程名)或遗漏(线程名无法设置,getName()
返回默认名称) - 第四处空白方法名错误:写成
run()
以外的名称(如runThread()
,JVM不会自动调用,线程无执行逻辑) - 第五处空白异常捕获错误:写成
Catch
(首字母大写)或try
(语法错误,try
后必须跟catch
或finally
)
- 第一处空白启动方法错误:写成
应试技巧
- 线程启动口诀:“线程对象创建后,start()方法来启动,自动调用run()方法,并发执行靠它行”
- 继承规则:“自定义线程继承Thread,run()方法必须重写,线程任务里面写”
- 异常处理:“sleep方法抛异常,try-catch不能忘,InterruptedException要捕获”
- 调试技巧:在
main
方法和run
方法中添加线程名打印(Thread.currentThread().getName()
),观察线程执行主体
通过本题,我们掌握了继承Thread
类创建线程的完整流程、start()
与run()
的区别、线程名的设置及sleep
方法的异常处理。理解线程的启动机制是掌握多线程编程的基础,对开发并发应用具有重要意义。