Java 继承Thread类和实现Runnable接口的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhiwenyan/article/details/53454890

java中线程的创建有两种方式
1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中;
2. 通过实现Runnable接口,实例化Thread类;

继承Thread类:

public class TestThreadDemo extends Thread {
    int num = 3;

    public TestThreadDemo(String ThreadName) {
        super(ThreadName);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++)
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "--->" + num--);
            }
    }

    public static void main(String[] args) {
        new TestThreadDemo("线程一").start();
        new TestThreadDemo("线程二").start();
        new TestThreadDemo("线程三").start();
    }
}

输出的结果:
这里写图片描述

通过实现Runnable接口


public class TestRunnable implements Runnable {
    int num = 3;

    public TestRunnable() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++)
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "--->" + num--);
            }
    }

    public static void main(String[] args) {
        TestRunnable tr = new TestRunnable();
        new Thread(tr, "线程一").start();
        new Thread(tr, "线程二").start();
        new Thread(tr, "线程三").start();
    }
}

输出的结果:
这里写图片描述

我们会发现两种实现线程的方式输出的结果不同,为什么会出现这种情况呢?我们可以这样思考一下:new TestThreadDemo()创建了三个对象时同时创建了三个线程,每个线程都有一个run()方法执行任务;第二种方法是三个线程共同的执行一个run()方法去执行任务,至于我输出的都是线程一,这个话可能是在抢CPU资源时,被线程一抢到了。至于线程二和线程三在执行的过程中,没有抢到资源。

在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。

其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。

猜你喜欢

转载自blog.csdn.net/zhiwenyan/article/details/53454890