Java多线程与异常处理实战解析:Thread类核心方法应用
一、原题完整代码呈现
以下是计算机二级Java考试中关于多线程和异常处理的典型题型,包含4处需要填写的空白(标记为//*********Found**********
):
public class Java_2 {
public static void main (String args[]) {
try {
Sleep a = new Sleep ();
Thread t = new Thread (a);
//*********Found**********
t._____________();
t.join();
int j= a.i;
System.out.println("j="+j+",a.i="+a.i);
} catch (Exception e) {}
}
}
//*********Found**********
class Sleep implements _________________{
int i;
public void run () {
try {
//*********Found**********
Thread._______________(50);
i= 10;
}
//*********Found**********
______________(InterruptedException e) {}
}
}
二、空白处逐一解析与解答
1. 第一处空白:线程启动方法
答案:start
//*********Found**********
t.start();
解析:
在Java中,创建线程对象(new Thread(a)
)后,需要调用start()
方法才能真正启动线程。start()
方法会触发JVM调用线程的run()
方法,实现多线程并发执行。
注意:直接调用run()
方法只会在当前线程中执行,不会创建新线程,这是考试中常见的易错点。
2. 第二处空白:线程接口实现
答案:Runnable
//*********Found**********
class Sleep implements Runnable{
解析: Thread
类的构造方法new Thread(a)
要求参数a
必须是Runnable
接口的实现类对象。Runnable
接口是函数式接口,仅包含run()
方法,用于定义线程执行体。因此Sleep
类需要声明实现Runnable
接口。
3. 第三处空白:线程休眠方法
答案:sleep
//*********Found**********
Thread.sleep(50);
解析: Thread.sleep(long millis)
是静态方法,用于使当前线程暂停执行指定的毫秒数(此处为50毫秒)。这是多线程中控制执行顺序的常用方法,会抛出InterruptedException
,需要在try
块中使用。
4. 第四处空白:异常捕获声明
答案:catch
//*********Found**********
catch(InterruptedException e) {}
解析: Thread.sleep()
方法声明抛出InterruptedException
,根据Java语法,必须对已检查异常进行处理(捕获或声明抛出)。此处使用try-catch
结构,因此需要catch
关键字来捕获该异常。
三、完整正确代码
四、程序运行结果与执行流程
运行结果
j=10,a.i=10
执行流程解析
主线程:
- 创建
Sleep
实例a
(实现Runnable
接口) - 创建线程对象
t
,关联a
- 调用
t.start()
启动线程,触发a.run()
执行 - 调用
t.join()
:主线程等待t
线程执行完毕后再继续
- 创建
新线程(t):
执行
run()
方法:- 调用
Thread.sleep(50)
:线程休眠50毫秒 - 休眠结束后将
i
赋值为10 - 捕获可能的
InterruptedException
- 调用
结果输出:
- 由于
join()
的作用,主线程在t
线程完成后才读取a.i
- 因此能正确获取
i=10
,输出j=10,a.i=10
- 由于
五、核心知识点总结
线程创建与启动
- 实现
Runnable
接口是创建线程的推荐方式(避免单继承限制) - 线程启动必须使用
start()
方法,而非直接调用run()
- 实现
Thread类关键方法
start()
:启动线程,由JVM调用run()
join()
:使当前线程等待目标线程执行完毕sleep(long millis)
:使当前线程休眠指定毫秒数,释放CPU资源
异常处理机制
InterruptedException
:线程休眠、等待时被中断会抛出此异常try-catch
结构:用于捕获和处理已检查异常- 语法要求:
try
块后必须跟catch
或finally
块
线程同步与协作
join()
方法是线程协作的基础,确保线程执行顺序- 共享变量(如
a.i
)在多线程访问时需注意可见性(本例题因join()
保证了正确性)
六、常见错误与应试技巧
常见错误分析
- 第一处空白用
run()
代替start()
:这是最典型错误,run()
只是普通方法调用,不会创建新线程 - 第二处空白误用
Thread
:写成extends Thread
虽然能运行,但题目中Thread t = new Thread(a)
的写法更符合Runnable
接口的使用场景 - 第三处空白用
wait()
:wait()
是Object
类方法,需配合synchronized
使用,此处应使用Thread.sleep()
- 第四处空白用
throws
:虽然可以声明抛出异常,但题目结构明显需要catch
捕获
- 第一处空白用
应试技巧
- 线程启动口诀:"创建对象后,启动用start,执行靠run"
- 接口识别:看到
new Thread(对象)
,该对象的类一定实现了Runnable
- 异常处理:
sleep()
方法必抛InterruptedException
,需用catch
处理 - 程序逻辑:
join()
方法确保主线程等待子线程,是理解输出结果的关键
通过本题,我们系统掌握了Java多线程的创建方式、核心方法及异常处理规范。这些知识点是Java并发编程的基础,在实际开发中,线程的启动、休眠和协作是处理并发任务的核心技能,也是计算机二级Java考试的重点考察内容。