java中继承Thread 和实现Runnable的区别

来源:互联网 发布:smartwatch2软件下载 编辑:程序博客网 时间:2024/06/06 07:47

java中继承Thread和实现Runnable的区别

以前一直以为线程继承Thread 和实现Runnable的区别是一个可以资源共享一个不能资源共享。 然后写了段代码发现其实Thread也可以资源共享。

继承Thread

public class ThreadSaleSecond  extends Thread{    public  int i=100000;    public void run(){        long start=System.currentTimeMillis();        while(i>0){            synchronized (this) {System.out.println(Thread.currentThread().getName()+"==="+i--);                }            }        long end=System.currentTimeMillis();        System.out.println(end-start+"ms");    }}        ThreadSaleSecond tss=new ThreadSaleSecond();        Thread t1=new Thread(tss);        Thread t2=new Thread(tss);        t1.start();        t2.start();

运行结果(只贴了部分):

Thread-2===5Thread-2===4Thread-2===3Thread-2===2Thread-2===1874msThread-1===0874ms

上面的时间为两个线程运行的时间 方便和Runnable进行对比

实现Runnable

public class ThreadSale implements Runnable {    private  int i=100000;    public void run() {        long start=System.currentTimeMillis();        while(i>0){        synchronized (this) {System.out.println(Thread.currentThread().getName()+"==="+i--);           }        }        long end=System.currentTimeMillis();        System.out.println(end-start+"ms");    }}        ThreadSale ts=new ThreadSale();        Thread t1=new Thread(ts);        Thread t2=new Thread(ts);        t1.start();        t2.start();

运行结果(只贴部分):

Thread-1===6Thread-1===5Thread-1===4Thread-1===3Thread-1===2Thread-1===1Thread-0===0905ms905ms

另一种就是Thread不共享资源

new ThreadSaleSecond().start();new ThreadSaleSecond().start();

结果:

Thread-0===10Thread-1===10Thread-0===9Thread-0===8Thread-0===7Thread-0===6Thread-0===5Thread-0===4Thread-0===3Thread-0===2Thread-1===9Thread-1===8Thread-1===7Thread-1===6Thread-1===5Thread-1===4Thread-1===3Thread-1===2Thread-1===1Thread-0===1

然后你会发现,两个都可以实现资源共享。用了10万条记录进行测试,而且时间都差不多。
深究其原因 发现其实Thread也实现了Runnable接口,也是可以实现资源共享的。Runnable这个接口中只有个run方法,而Thread中有很多方法。
1.Runnable解决了单继承的局限性
2.引用API中说的一段话: 通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。
3.大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。
自己的理解 如有问题请留言指出。