浅析Java中Runnable和Thread的区别
一、概述
在 Java 中,实现多线程的方式主要有两种:实现 Runnable 接口和继承 Thread 类。它们是实现多线程的两种不同的方式,具有不同的特点和适用场景。
二、Runnable 接口
Runnable 接口是一种使用范围更广的方式,用于实现线程的类只需要实现 Runnable 接口中的 run() 方法。Runnable 对象在被线程执行时,其 run() 方法所实现的代码会运行在一个独立的、新的线程中。
下面是一个简单的示例,展示如何通过实现 Runnable 接口实现多线程:
public class MyRunnable implements Runnable {
public void run() {
System.out.println("MyRunnable线程执行中");
}
}
public class RunnableDemo {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
如上述代码所示,通过实现 Runnable 接口并实现其 run() 方法,然后将其传递给 Thread 类的构造方法中进行创建,最后调用 start() 方法启动线程。
三、Thread 类
Thread 类直接继承自 Object 类,因此可以使用类的方法和变量。如果要实现多个线程,不推荐直接继承 Thread 类,而是应该实现 Runnable 接口。
下面是一个简单的示例,展示如何通过继承 Thread 类实现多线程:
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread线程执行中");
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
如上述代码所示,通过继承 Thread 类并重写其 run() 方法,然后创建该子类的对象,并调用 start() 方法启动线程。
四、区别
Runnable 接口是可以被继承的,因此更加灵活可扩展。而 Thread 类是一个类,因此需要通过继承后进行扩展,但是这将减少了继承的机会。在实现多个线程时,由于 Java 不支持多重继承,因此继承 Thread 类的成本更高。
Runnable 接口相比于继承 Thread 类其另一个优点是该实现可以作为属于同一个类中的一个对象共享。而 Thread 类中的成员变量不能在多个线程间共享,因此需要使用 synchronized 等方法来实现线程同步。
五、示例说明
下面的例子就是一个实现 Runnable 接口的场景,在使用线程池的情况下可以实现更多的线程执行:
public class MyRunnable implements Runnable {
private int i;
public MyRunnable(int i) {
this.i = i;
}
public void run() {
System.out.println("MyRunnable线程" + i + "执行中");
}
}
public class RunnableDemo {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(new MyRunnable(i));
}
executor.shutdown();
}
}
通过维护一个 MyRunnable 对象数组并初始化,然后将其作为 Runnable 对象传递给 ExecutorService 中,最终执行了 10 个不同的线程任务。
六、总结
通过对 Runnable 接口和 Thread 类的分析,我们可以发现,两者各有优缺点,适用于不同的场景。实现多线程的方式要根据情况选择合适的方式,以达到最佳的效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java中Runnable和Thread的区别 - Python技术站