大話Android多執行緒(一) Thread和Runnable的聯絡和區別

Anlia發表於2018-01-29

版權宣告:本文為博主原創文章,未經博主允許不得轉載
原始碼:github.com/AnliaLee
大家要是看到有錯誤的地方或者有啥好的建議,歡迎留言評論

前言

這是Android多執行緒篇的第一章,我們就從執行緒的建立聊起吧。常用的執行緒建立方式有兩種(實現Callable介面的方式,我們放到以後介紹Executor框架的時候再敘)

  • 繼承Thread類,重寫Threadrun()方法
  • 實現Runnable介面,重寫Runnablerun()方法,並將其作為引數例項化Thread

我們本章的主題正是通過比對上述兩種方式建立的執行緒在執行任務時的差別,來理解ThreadRunnable的聯絡和區別

先說結論:

  • 兩者的聯絡
    1、Thread類實現了Runnable介面
    2、都需要重寫裡面run()方法
  • 兩者的區別
    1、實現Runnable的類更具有健壯性,避免了單繼承的侷限
    2、Runnable更容易實現資源共享,能多個執行緒同時處理一個資源

Thread和Runnable的比較

我們就以經典的賣票系統講個故事吧。話說有小T(Thread)和小R(Runnable)兩個票販子,手下各有兩個業務員,平常就幹著倒賣活動門票的活(執行緒執行任務)。有一天,他們各拿到了5張某演唱會的門票,兩人將售票的任務交給手下的業務員

小T這邊的業務是這樣運轉的(定義Thread類的子類,重寫run()方法,run()方法即為賣票任務)

public class TicketThread extends Thread {
	private int ticket = 5;
	private String name;

	public TicketThread(String name) {
		this.name = name;
	}

	public void run() {
		for (int i = 0; i < 5; i++) {
			if (ticket > 0) {
				Log.e("T公司",name + "賣了一張票,編號為t" + (ticket--));
			}
		}
	}
}
複製程式碼

業務員一大早就開始賣票,很快就賣完了(例項化Thread的子類,呼叫start()方法啟動該執行緒)

TicketThread t1 = new TicketThread("1號業務員");
TicketThread t2 = new TicketThread("2號業務員");

t1.start();
t2.start();
複製程式碼

大話Android多執行緒(一) Thread和Runnable的聯絡和區別

而小R的業務流程則是這樣的(實現Runnable介面,重寫Runnablerun()方法)

public class TicketRunnable implements Runnable {
	private int ticket = 5;

	public void run() {
		for (int i = 0; i < 5; i++) {
			if (ticket > 0) {
				Log.e("R公司",Thread.currentThread().getName() + "賣了一張票,編號為r" + (ticket--));
			}
		}
	}
}
複製程式碼

業務員同樣很快就把票賣完了(建立Thread子類的例項,將實現了Runnable介面的物件作為引數例項化Thread物件,呼叫start()方法啟動執行緒)

TicketRunnable runnable = new TicketRunnable();
Thread r1 = new Thread(runnable, "1號業務員");
Thread r2 = new Thread(runnable, "2號業務員");

r1.start();
r2.start();
複製程式碼

大話Android多執行緒(一) Thread和Runnable的聯絡和區別

事畢,兩人決定吃個飯慶祝一下。一番交流後,小R很驚訝小T為啥可以將同樣的票多賣一倍的錢,小T得意地安利了自己的賣票心得:

“因為我將票影印了一份,這樣我兩個小弟就可以各拿一份票去兜售了(通過繼承Thread的方式,當新建立一個執行緒啟動時,其繫結的任務同樣也新建了一份,這樣他們的任務是相互獨立的,自然也無法實現資源共享了)”

小R聽後感嘆不已:

“竟然還有這種操作?我耿直地將票交給兩個業務員就算了啊(實現Runnable介面的方式,因為都是用同一個Runnable物件建立的執行緒,因此多執行緒實際上執行的是同一個任務,這樣也就共享了資源)”

接著小R又問小T:“你這麼幹,事後不怕買到假票的人來找你?” 小T聽後不以為然道:

“怕啥,我們不都是幹完一票就跑路的麼(執行緒執行完run()方法後會自行銷燬)”

小R:“我從未見過有如此厚顏無恥之人......”

(未完待續...)


下章預告

由於小R誠信經營,生意越做越大,但最近他卻收到了一些投訴,有顧客說他們買到了假票。小R懷疑是自己手下乾的,遂決定招個人監督自己的手下。這天,一個自稱synchronized的男人前來應聘...

相關文章