Java 多线程基础实战解析:线程的创建与运行
一、原题完整代码呈现
以下是计算机二级Java考试中关于多线程编程的典型题型,主要考察线程类的定义、线程启动方法、构造函数实现以及线程信息输出,包含5处需要填写的空白(标记为//*********Found**********
):
//*********Found**********
public class Java_2 _______________{
private String sThreadName;
public static void main(String argv[]){
Java_2 first = new Java_2("first");
//*********Found**********
first._________;
Java_2 second = new Java_2("second");
//*********Found**********
second._________;
}
//*********Found**********
public ___________(String s){
sThreadName = s;
}
public String getThreadName(){
return sThreadName;
}
public void run(){
for(int i = 0; i < 4; i ++){
//*********Found**********
System.out.println(_________________+i);
try{
Thread.sleep(100);
} catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
}
}
二、空白处逐一解析与解答
1. 第一处空白:继承线程类
答案:extends Thread
//*********Found**********
public class Java_2 extends Thread {
解析:
Java中创建线程的方式之一是继承Thread
类并重写run()
方法。程序中包含run()
方法,说明该类需要作为线程类使用,因此需继承Thread
类,填写extends Thread
。
2. 第二处空白:启动第一个线程
答案:start()
//*********Found**********
first.start();
解析:
线程创建后(new Java_2(...)
),需调用start()
方法启动线程(而非直接调用run()
)。start()
方法会自动调用run()
方法并开启新线程,因此填写start()
。
3. 第三处空白:启动第二个线程
答案:start()
//*********Found**********
second.start();
解析:
与第一个线程同理,第二个线程对象second
也需要通过start()
方法启动,使两个线程能够并发执行,因此填写start()
。
4. 第四处空白:定义构造方法
答案:Java_2
//*********Found**********
public Java_2(String s){
sThreadName = s;
}
解析:
构造方法用于初始化对象,名称必须与类名完全一致。该方法接收字符串参数用于设置线程名称,因此方法名为Java_2
。
5. 第五处空白:输出线程名称与计数
答案:getThreadName()
//*********Found**********
System.out.println(getThreadName() + i);
解析: getThreadName()
方法返回当前线程的名称(sThreadName
),循环中需要打印"线程名+计数"(如first0
、second1
)。通过调用该方法获取线程名称,因此填写getThreadName()
。
三、完整正确代码
四、程序功能与运行说明
程序功能
该程序通过继承Thread
类实现多线程,核心功能包括:
- 定义
Java_2
线程类,可设置线程名称 - 在
run()
方法中实现线程任务:循环4次打印线程名+计数,并休眠100毫秒 - 主方法中创建两个线程("first"和"second")并启动,实现并发执行
运行说明
程序启动后,两个线程并发执行,输出结果具有不确定性(线程调度顺序由系统决定),典型输出如下:
first0 second0 first1 second1 second2 first2 first3 second3
(注:实际输出顺序可能不同,但每个线程会按0→1→2→3的顺序打印)
执行特点:
- 两个线程交替执行(因
Thread.sleep(100)
释放CPU资源) - 每个线程独立完成4次循环
- 总执行时间约400毫秒(而非800毫秒),体现多线程并发优势
- 两个线程交替执行(因
五、核心知识点总结
线程的创建方式
继承
Thread
类:- 类声明为
extends Thread
- 重写
run()
方法(线程执行的核心逻辑) - 创建实例后调用
start()
方法启动(而非直接调用run()
)
- 类声明为
- 与实现
Runnable
接口的区别:继承方式受单继承限制,接口方式更灵活,但本题采用继承方式实现
线程的生命周期
- 新建状态:
new Java_2(...)
创建对象但未启动 - 就绪状态:调用
start()
后进入就绪队列,等待CPU调度 - 运行状态:CPU调度后执行
run()
方法 - 阻塞状态:
Thread.sleep(100)
使线程暂停,进入阻塞状态 - 终止状态:
run()
方法执行完毕后线程结束
- 新建状态:
线程的并发特性
- 调度不确定性:多个线程的执行顺序由操作系统调度算法决定,每次运行结果可能不同
- 资源共享:本题未涉及共享资源,若有共享变量需考虑同步问题
- 休眠方法:
Thread.sleep(long millis)
使当前线程暂停指定时间,释放CPU资源给其他线程
构造方法与成员方法
- 构造方法:
public Java_2(String s)
用于初始化线程名称,存储在sThreadName
- 访问方法:
getThreadName()
提供对私有变量sThreadName
的访问,符合封装原则 - 线程任务:
run()
方法中的循环和打印构成线程的具体工作内容
- 构造方法:
六、常见错误与应试技巧
常见错误分析
- 第一处空白继承错误:写成
implements Thread
(Thread
是类,需用extends
)或遗漏继承(导致start()
方法不可用) - 第二、三处空白启动错误:写成
run()
(直接调用方法,不会开启新线程)或start
(遗漏括号) - 第四处空白构造方法错误:写成
Thread
(方法名与类名不一致)或java_2
(小写类名,Java区分大小写) - 第五处空白方法调用错误:直接使用
sThreadName
(私有变量无法在该上下文访问)或getThreadName
(遗漏括号)
- 第一处空白继承错误:写成
应试技巧
- 线程创建口诀:"继承Thread类,重写run方法,start来启动,并发执行它"
- 启动与运行区别:"start()启动新线程,run()只是普通方法"
- 输出调试:通过打印线程名可清晰跟踪多线程的执行顺序
- 异常处理:
Thread.sleep()
必须捕获InterruptedException
,是多线程编程的常见考点
通过本题,我们掌握了继承Thread
类创建多线程的方法,理解了线程启动、执行和调度的基本原理。多线程是Java并发编程的基础,在服务器开发、实时处理等场景中广泛应用。掌握线程的创建与运行机制,对编写高效的并发程序具有重要意义。