1. 程式人生 > >Java執行緒——Runnable和Thread的區別

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);
        }
    }
}