JAVA中Thread VS Runnalbe

JAVA中创建线程有两种方式, 直接继承Thread或者实现Runnable接口,然后将Runnable实现类对象传入Thread.
本篇讨论的内容:

一,Thread和Runnable的关系
二, 创建线程的使用过程中,Thread和Runnable的选择?

=========================
一,Thread和Runnable的关系
我们实现线程的时候会考虑到通过实现Runnable接口,然后将实现了这个接口的实例传递给Thread的构造函数,然后开启线程.那么我们看看Runnable到底是个什么东西?

public interface Runnable {
    public abstract void run();
}

我们可以发现Runnable接口就是一个简单的接口, 里面一个抽象的Runable方法. 他怎么和线程关联呢? 那我们就进入Thread类看看

首先,我们可以发现在Thread中有一个Runnable类型的成员变量target

   ..............
 /* What will be run. */
    private Runnable target;
    ..............

再继续向下看

 public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
 private void init(ThreadGroup g, Runnable target, String name,
                      long stackSize) {
     .........
        this.group = g;
        this.daemon = parent.isDaemon();
        this.priority = parent.getPriority();
        this.name = name.toCharArray();
        if (security == null || isCCLOverridden(parent.getClass()))
            this.contextClassLoader = parent.getContextClassLoader();
        else
            this.contextClassLoader = parent.contextClassLoader;
        this.inheritedAccessControlContext = AccessController.getContext();
        //复制给成员变量target
        this.target = target;
        setPriority(priority);
        if (parent.inheritableThreadLocals != null)
            this.inheritableThreadLocals =
                ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);
        /* Stash the specified stack size in case the VM cares */
        this.stackSize = stackSize;

        /* Set thread ID */
        tid = nextThreadID();
    }

我们可以看到,使用Thread(Runnable target),然后调用init方法,检查线程初始化的条件是否满足,设置线程名字,线程编号等等,又把传递过来的target对象传递给Thread的成员变量

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

然后在线程的run方法中,判断target对象是否为空,若不为空,那么Thread就执行了Runnable中的run()方法内容.

由上面我们可以提出问题为什么java中提供继承Thread类和实现Runnable方法两种方式创建线程呢? 在这里我们可以猜测,主要是由于java的继承体系只支持单继承,为了扩展和使创建线程的方式更加灵活,就又增加了使用Runnable 接口方式

二, 创建线程的使用过程中,Thread和Runnable的选择?
1,java不支持多继承,如果继承Thread类实现线程,意味着你将失去机会扩展或者继承其他类了

2,在面向对象的编程中,继承一个类通常意味着增加新的功能,或者修改和提升改善类的行为(方法).如果没有这些需求那就选择Runnable

3,Runnable接口通常代表一个可以被Thread,Executers或者其他方式执行的一个实例,如果考虑到任务的逻辑奋力使用Runnable更好一些

4,任务分离的Runnable可以重用任务和更自由的被其他方式进行执行. 一个Thread执行完毕后不会被重启

第二部分参考查阅: http://javarevisited.blogspot.com/2012/01/difference-thread-vs-runnable-interface.html#ixzz3Y3UtwTQx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值