1. 程式人生 > >實現Runnable介面和繼承Thread類區別

實現Runnable介面和繼承Thread類區別

如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable介面的話,則很容易的實現資源共享。

實現Runnable介面比繼承Thread類所具有的優勢:

1):適合多個相同的程式程式碼的執行緒去處理同一個資源

2):可以避免java中的單繼承的限制

3):增加程式的健壯性,程式碼可以被多個執行緒共享,程式碼和資料獨立

直接看程式碼:

1、繼承Thread的demo

package com.multithread.learning;
/**
 *多執行緒學習,繼承Thread,資源不能共享
 *@author
 */
class Thread1 extends Thread{
	private int count=5;
	private String name;
    public Thread1(String name) {
       this.name=name;
    }
	public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(name + "執行  count= " + count--);
            try {
                sleep((int) Math.random() * 10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
       
	}
}

public class Main {

	public static void main(String[] args) {
		Thread1 mTh1=new Thread1("A");
		Thread1 mTh2=new Thread1("B");
		mTh1.start();
		mTh2.start();
	}
}
2、實現Runnable的demo
/**
 *多執行緒學習 實現runnable,資源能共享
 *@author 
 */
package com.multithread.runnable;
class Thread2 implements Runnable{
    private int count=15;
	@Override
	public void run() {
		  for (int i = 0; i < 5; i++) {
			  System.out.println(Thread.currentThread().getName() + "執行  count= " + count--);
	            try {
	            	Thread.sleep((int) Math.random() * 10);
	            } catch (InterruptedException e) {
	                e.printStackTrace();
	            }
	        }
	}
	
}
public class Main {

	public static void main(String[] args) {
		Thread2 mTh = new Thread2();
	        new Thread(mTh, "C").start();//同一個mTh,但是在Thread中就不可以,如果用同一個例項化物件mt,就會出現異常   
	        new Thread(mTh, "D").start();
	        new Thread(mTh, "E").start();
	}
}
//這裡要注意每個執行緒都是用同一個例項化物件,如果不是同一個,效果就和上面的一樣了!

提醒一下大家:main方法其實也是一個執行緒。在java中所有的執行緒都是同時啟動的,至於什麼時候,哪個先執行,完全看誰先得到CPU的資源。

在java中,每次程式執行至少啟動2個執行緒。一個是main執行緒,一個是垃圾收集執行緒。因為每當使用java命令執行一個類的時候,實際上都會啟動一個jvm,每一個jvm實際上就是在作業系統中啟動了一個程序。