Java线程——Runnable和Thread的区别

Runnable 是接口

Thread 是类,且实现(implement)了Runnable接口

Thread源码:

public class Thread
    implements Runnable
{
    private static class Caches
    {
        static final ConcurrentMap subclassAudits = new ConcurrentHashMap();
        static final ReferenceQueue subclassAuditsQueue = new ReferenceQueue();

Runnable源码

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

Thread类,有一个构造方法:public Thread(Runnable targer)

 public Thread(Runnable runnable)
    {
        daemon = false;
        stillborn = false;
        threadLocals = null;
        inheritableThreadLocals = null;
        threadStatus = 0;
        blockerLock = new Object();
        init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L);
    }

此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程

使用情况

在程序开发中只要是多线程肯定永远以实现Runnable接口为主

因为接口的实现可以实现多个,而类的继承只能是单继承。因此在开辟新线程时能够使用Runnable接口就尽量不要使用从Thread类继承的方式来开辟新的线程。

实现Runnable接口相比继承Thread类有如下好处:
1、避免继承的局限,一个类可以继承多个接口
2、适合于资源的共享

测试代码

继承Thread类

package com.xzf.test;

public class ExtendThread {
    public static void main(String args[]) {
        Runnable2 r2 = new Runnable2();
        r2.start();
        for (int i = 0; i < 10; i++) {
            System.out.println("Main:"+i);
        }
    }
}

/*class Runnable2 extends Thread {  */     因为Threaed方式实现了Runnable接口,所以可以直接继承Thread,不过run方法依旧要写的

class Runnable2 extends Thread implements Runnable { 
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Runnable2:"+i);
        }
    }
}

实现Runnable接口

package com.xzf.test;


public class RunnableDemo{ 
    public static void main(String args[]) {
        Runnable1 r1 = new Runnable1();//new 一个新的线程对象
//       r1.run();//对run方法进行调用,直到走完run方法再继续走main方法
        Thread thread = new Thread(r1);//要启动一个新的线程就必须new一个Thread对象出来
        thread.start();//启动新开辟的线程,执行run方法,和main方法并行
        
        for(int i=0;i<10;i++) {
            System.out.println("Mainthread:" + i);
        }
    }
}

class Runnable1 implements Runnable{
    public void run() {
        for(int i=0;i<10;i++) {
            System.out.println("Runnable:" + i);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_39634657/article/details/81390985