Java執行緒——Runnable和Thread的區別
阿新 • • 發佈:2018-12-31
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);
}
}
}