原创

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接口两种方式创建线程的实现原理、优缺点,并通过代码示例展示了它们的用法。初学者通过阅读本教程,能够深入理解这两种创建线程的方式,为编写多线程程序提供更多选择。

正文到此结束
本文目录