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

来源:互联网 发布:数据库毕业论文题目 编辑:程序博客网 时间:2024/05/21 10:16

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)创建子类。

0 0