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方法的异常处理。理解线程的启动机制是掌握多线程编程的基础,对开发并发应用具有重要意义。