何时继承Thread类何时选择实现Runnable接口

差别
1.继承thread的类,在创建它的对象时,创建两个thread,他们各自执行各自的进程,互不干扰,Thread类当中的数据也是彼此独立。
但是在Runnable中,创建一个实现了Runnable接口的类的对象后,可以将这一个对象分别在创建进程时都传递给线程的构造函数:
ImplementRunnable r1 = new ImplementRunnable();
ImplementRunnable r2 = new ImplementRunnable();
Thread t1 = new Thread(r1, "张三");
Thread t2 = new Thread(r1, "lisi");

使得线程在执行时,调用的是同一个Runnable实现类对象,那么Runnable实现类当中的数据,就是两个线程共享的数据。
具体如下代码及其执行结构所示:
Runnable实现类

public class ImplementRunnable implements Runnable {

    private int a = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        for (int i = 0; i < 20; i++) {
            System.out.println("Thread--" + Thread.currentThread().getName() + "--运行;a为:" + (a++));
        }
    }

}
    **Thread继承类**
public class ExtendThread extends Thread {

    private int a = 0;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        for (int i = 0; i < 20; i++) {
            System.out.println("Thread--" + getName() + "--运行;a为:" + (a++));
        }
    }
}

运行的调用类

public class ThreadText {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // ExtendThread thread1 = new ExtendThread();
        // thread1.setName("张三");
        // ExtendThread thread2 = new ExtendThread();
        // thread2.setName("lisi");
        // thread1.start();
        // thread2.start();
        ImplementRunnable r1 = new ImplementRunnable();
        ImplementRunnable r2 = new ImplementRunnable();
        Thread t1 = new Thread(r1, "张三");
        Thread t2 = new Thread(r1, "lisi");
        t1.start();
        t2.start();
    }
}

最后的运行结果:
何时继承Thread类何时选择实现Runnable接口_第1张图片

在使用Runnable实现类的方法中,a的值是两个线程共享的,每个线程运行20次,但是线程终端的地方是不一定的,所以有可能出现a线程运行++但是还没有运行输出结果就中断了,然后b运行,所以就出现0在1前面了。

何时继承Thread类何时选择实现Runnable接口_第2张图片

在使用Thread继承类的方法时,创建两个线程,各自运行,数据并不共享,各自运行20次循环。

你可能感兴趣的:(JAVA)