再探SE——线程类的创建以及为什么大家都偏向实现Runnable接口

在JAVA中线程类的创建有三种方式。

一 继承Thread 类创建线程类

package com.vvan;

public class MyThread extends Thread {

    private int i=0;

    public void run(){
        for (; i<10; i++) {
            System.out.println(getName()+"   "+i);
        }
    }

    public static  void main(String[]args){
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+""+i);

            new MyThread().start();
            new MyThread().start();

        }

    }


}

main0
Thread-0   0
main1
Thread-1   0
Thread-0   1
Thread-0   2
Thread-1   1
Thread-1   2
Thread-1   3
Thread-1   4
Thread-1   5
Thread-2   0
main2
Thread-0   3
Thread-2   1

 两次new Thread 分别创建各自的Thread 实例,只能访问各自的实例变量i ,不能共享该实例变量。

二 实现Runnable 接口创建线程类

package com.vvan;

public class MyThread implements Runnable {

    private int i=0;

    public void run(){
        for (; i<10; i++) {
            System.out.println(Thread.currentThread().getName()+"  "+i);
        }
    }

    public static  void main(String[]args){

            System.out.println(Thread.currentThread().getName());

            MyThread myThread=new MyThread();
            new Thread(myThread,"我的一号线程").start();
            new Thread(myThread,"我的二号线程").start();
    }
}
main
我的二号线程  0
我的一号线程  0
我的二号线程  1
我的一号线程  2
我的二号线程  3
我的一号线程  4
我的二号线程  5
我的一号线程  6
我的二号线程  7
我的一号线程  8
我的二号线程  9

Process finished with exit code 0

在这里的线程对象依然是new Thread ,new MyThread(实现Runnable接口的自定义类) 只是作为new Thread的target,只创建类一次。被两个 new Thread 对象 共享使用。 

三 使用Callable 和future 创建线程

省略。。。。

问题:为什么更偏向实现Runnable 接口

答:1.Java的继承只能单继承,这意味着已经有父类的子类并不可以再继承Thread类来实现多线程机制

 2.实现Runnable接口的多线程类,可以共享类中同一个实例变量。更加符合使用多线程的业务需求

猜你喜欢

转载自blog.csdn.net/weixin_42009069/article/details/81704621
今日推荐