Java多线程基础实操题解析:实现Runnable接口的线程创建
一、原题代码呈现
以下是计算机二级Java实操题的原题代码,包含4处需要填写的空白(标记为//*********Found**********
):
//*********Found**********
public class Java_2 ___________________{
private int x=0;
private int y=0;
public static void main(String[]args){
Java_2 r = new Java_2();
//*********Found**********
Thread t = new Thread( ___________________ );
t.start();
}
public void run() {
//*********Found**********
int ___________________ = 0;
for(;;){
x++;
//*********Found**********
___________________;
k++;
if (k>5) break;
System.out.println("x=" + x + ",y ="+ y);
}
}
}
二、空白处分析与解答
1. 第一处空白:类的继承/实现声明
//*********Found**********
public class Java_2 implements Runnable {
解析:
程序中定义了run()
方法,这是Runnable
接口的核心方法。Java中实现多线程的方式之一是实现Runnable
接口,因此类需要声明implements Runnable
,否则run()
方法无法被线程正确调用。
2. 第二处空白:Thread构造方法的参数
//*********Found**********
Thread t = new Thread( r );
解析: Thread
类的构造方法可以接收Runnable
类型的参数(即实现了Runnable
接口的对象)。此处r
是Java_2
类的实例(已实现Runnable
接口),将其作为参数传入,线程启动后会执行r
对象的run()
方法。
3. 第三处空白:循环控制变量的声明
//*********Found**********
int k = 0;
解析:
后续代码中出现了k++
和if (k>5) break
,说明k
是循环计数器。此处需要声明int
类型的变量k
并初始化(通常初始化为0),否则会报“变量未定义”错误。
4. 第四处空白:y变量的自增操作
//*********Found**********
y++;
解析:
程序的逻辑是在循环中对x
和y
进行操作,然后输出它们的值。观察代码结构,x++
后缺少对y
的操作,而输出语句包含y
,因此此处应添加y++
使y
随循环自增,保证输出逻辑完整。
三、完整正确代码
四、程序运行逻辑与多线程知识点
运行结果
程序启动后,线程会执行run()
方法中的循环,共输出5行结果(k
从1到5):
x=1,y=1
x=2,y=2
x=3,y=3
x=4,y=4
x=5,y=5
核心知识点解析
Runnable接口实现多线程的原理
Runnable
接口是函数式接口,仅包含run()
方法,用于定义线程执行体。- 实现
Runnable
接口的类需要重写run()
方法,将线程逻辑放入其中。 - 必须通过
Thread
类包装(new Thread(runnable)
)才能启动线程,调用start()
方法而非直接调用run()
。
start()
与run()
的区别start()
:启动线程,由JVM调用run()
方法,真正实现多线程运行。run()
:普通方法调用,若直接调用则不会创建新线程,仅在当前线程中执行。
循环控制与变量作用域
- 此处使用
for(;;)
创建无限循环,通过k
的计数器控制退出条件(k>5
时break
)。 - 变量
k
声明在run()
方法内部,属于局部变量,仅在该方法中有效。
- 此处使用
五、常见错误与应试技巧
常见错误
- 第一处空白误写为
extends Thread
:虽然继承Thread
也能实现多线程,但本题中类已定义run()
方法且无Thread
的其他方法调用,更符合implements Runnable
的场景。 - 第二处空白传入
this
或Java_2
:this
在main
方法(静态方法)中无法使用,而Java_2
是类名,不能直接作为参数(需传入实例)。 - 第四处空白误写为
x--
或y=k
:不符合输出结果中x
和y
同步增长的逻辑。
- 第一处空白误写为
应试技巧
- 遇到多线程题目时,先观察是否有
run()
方法,再判断是实现Runnable
接口还是继承Thread
类。 - 注意静态方法(如
main
)中不能直接使用this
,需通过创建对象实例调用非静态方法/属性。 - 变量未定义的错误通常是由于缺少声明,可根据后续使用的变量名(如
k
)补全声明。
- 遇到多线程题目时,先观察是否有
通过本题可以掌握Java多线程的基础实现方式,理解Runnable
接口的应用场景,以及线程启动的核心逻辑。在实际开发中,实现Runnable
接口比继承Thread
类更灵活(可避免单继承限制),是更推荐的多线程实现方式。