java面试题-说说创建线程的两种方式?
在Java中,创建线程有两种主要的方式:一种是将类声明为Thread的子类,另一种是声明一个类实现Runnable接口。本教程将详细讲解这两种方式的实现原理、优缺点以及通过代码示例帮助初学者深入理解。
1. 使用Thread类的子类创建线程
1.1 实现原理
- 定义Thread类的子类。
- 重写该类的
run()
方法,该方法的方法体代表了线程需要完成的任务,因此称为线程执行体。 - 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的
start()
方法来启动该线程。
1.2 代码示例
class MyThread extends Thread {
@Override
public void run() {
// 线程执行体,定义线程需要完成的任务
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Count: " + i);
}
}
}
public class ThreadExample {
public static void main(String[] args) {
// 创建线程对象
MyThread myThread = new MyThread();
// 启动线程
myThread.start();
// 主线程执行的内容
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Main Count: " + i);
}
}
}
1.3 优缺点
优点:
- 直观,代码结构清晰。
缺点:
- 由于Java是单继承,如果已经有了一个父类,就不能再继承Thread类。
2. 实现Runnable接口创建线程
2.1 实现原理
- 定义Runnable接口的实现类。
- 重写该接口的
run()
方法,该方法的方法体同样是线程的执行体。 - 创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,Thread对象才是真正的线程对象。
- 调用线程对象的
start()
方法来启动线程。
2.2 代码示例
class MyRunnable implements Runnable {
@Override
public void run() {
// 线程执行体,定义线程需要完成的任务
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Count: " + i);
}
}
}
public class RunnableExample {
public static void main(String[] args) {
// 创建Runnable实现类的实例
MyRunnable myRunnable = new MyRunnable();
// 创建线程对象,以myRunnable为target
Thread thread = new Thread(myRunnable);
// 启动线程
thread.start();
// 主线程执行的内容
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + " - Main Count: " + i);
}
}
}
2.3 优缺点
优点:
- 避免了单继承的限制,一个类可以实现多个接口。
缺点:
- 稍显繁琐,需要创建Runnable实现类的实例,并通过这个实例来创建Thread对象。
3. 总结
本教程详细讲解了使用Thread类的子类和实现Runnable接口两种方式创建线程的实现原理、优缺点,并通过代码示例展示了它们的用法。初学者通过阅读本教程,能够深入理解这两种创建线程的方式,为编写多线程程序提供更多选择。
正文到此结束
- 本文标签: Java 面试题
- 本文链接: https://www.jietongc.com/article/63
- 版权声明: 本文由大熊科技原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权