細說繼承Thread類和實現Runnable介面來建立執行緒的區別
阿新 • • 發佈:2019-01-10
建立執行緒有兩種方法,一種是繼承Tread類,另一種是繼承Runnable介面
繼承Tread類
MyThread extends Thread{
@overwrite
public void run(){
業務流程
}
}
public static void main(String[] args){
MyThread mt = new MyTread();
mt.start();
}
實現Runnable介面
MyThread implements Runnable{
@overwrite
public void run(){
業務流程
}
}
public static void main(String[] args){
MyThread mt = new MyTread();
Thread td = new Thread(mt);
td.start();
}
從程式碼的角度來說,實現Runnable介面比繼承Thread,多了一個步驟,把要乾的事塞進了一執行緒裡(可以這麼理解)
但是java是一種單繼承語言,用Runnable介面就擺脫了這種缺陷,並且,對於同一個資源的消耗來說,要用Runnable介面,繼承Thread類無法處理對相同資源處理的情況,即Runnable的程式碼,可以被多個執行緒(Thread例項)共享
例如多個售票視窗售票:
現有3個視窗,賣5張票
繼承Thread類實現
class MyThread extends Thread{
private int ticket = 5; //總票數
private String name; //視窗號
public MyThread(String name) {
this.name=name;
}
@Override
public void run() {
while(ticket>0){
ticket--;
System.out.println(name+"買了1張票,剩餘票數為:" +ticket);
}
}
}
public class TicketThread {
public static void main(String[] args) {
//建立三個執行緒來模擬三個售票視窗
MyThread mt1 = new MyThread("視窗1");
MyThread mt2 = new MyThread("視窗2");
MyThread mt3 = new MyThread("視窗3");
mt1.start();
mt2.start();
mt3.start();
}
}
結果為:
可以看出繼承Thread類無法處理這種情況
實現Runnable介面
class MyThreadr implements Runnable{
private int ticket = 5; //總票數
@Override
public void run() {
while(ticket>0){
ticket--;
//Thread.currentThread()代表當前執行緒
System.out.println(Thread.currentThread().getName()+"買了1張票,剩餘票數為:"+ticket);
}
}
}
public class TicketRunnableThread {
public static void main(String[] args) {
MyThreadr mt1 = new MyThreadr();
//建立三個執行緒來模擬三個售票視窗
//Thread有種預設的構造方法,可以這樣建立執行緒時給執行緒起名
Thread td1 = new Thread(mt1,"視窗1");
Thread td2 = new Thread(mt1,"視窗2");
Thread td3 = new Thread(mt1,"視窗3");
td1.start();
td2.start();
td3.start();
}
}
結果為:
另外如果把建立執行緒的方式換成這樣的話,那麼就跟繼承Thread類一樣了
public static void main(String[] args) {
MyThreadr mt1 = new MyThreadr();
MyThreadr mt2 = new MyThreadr();
MyThreadr mt3 = new MyThreadr();
//建立三個執行緒來模擬三個售票視窗
//Thread有種預設的構造方法,可以這樣建立執行緒時給執行緒起名
Thread td1 = new Thread(mt1,"視窗1");
Thread td2 = new Thread(mt2,"視窗2");
Thread td3 = new Thread(mt3,"視窗3");
td1.start();
td2.start();
td3.start();
}