多執行緒及Runable 和Thread的區別

2021-09-16 21:28:40 字數 1799 閱讀 3721

thread和runnable區別

執行多執行緒操作可以選擇

繼承thread類

實現runnable介面

1.繼承thread類

以賣票視窗舉例,一共5張票,由3個視窗進行售賣(3個執行緒)。

**:

package thread;

public class threadtest

}class mythreadtest extends thread

public void run()

system.out.println(name + " = " + ticket--);

} } }

執行結果:

視窗1 = 5

視窗1 = 4

視窗1 = 3

視窗1 = 2

視窗1 = 1

視窗2 = 5

視窗3 = 5

視窗2 = 4

視窗3 = 4

視窗3 = 3

視窗3 = 2

視窗3 = 1

視窗2 = 3

視窗2 = 2

視窗2 = 1

結果一共賣出了5*3=15張票,這違背了"5張票"的初衷。

造成此現象的原因就是:

mythreadtest mt1 = new mythreadtest("視窗1");

mythreadtest mt2 = new mythreadtest("視窗2");

mythreadtest mt3 = new mythreadtest("視窗3");

mt1.start();

mt2.start();

mt3.start();

一共建立了3個mythreadtest物件,而這3個物件的資源不是共享的,即各自定義的ticket=5是不會共享的,因此3個執行緒都執行了5次迴圈操作。

2.實現runnable介面

同樣的例子,**:

package thread;

public class runnabletest

}class myrunnabletest implements runnable

system.out.println(thread.currentthread().getname() + " = " + ticket--);

} } }

結果:

視窗1 = 5

視窗1 = 2

視窗3 = 4

視窗2 = 3

視窗1 = 1

結果賣出了預期的5張票。

原因在於:

myrunnabletest mt = new myrunnabletest();

thread mt1 = new thread(mt,"視窗1");

thread mt2 = new thread(mt,"視窗2");

thread mt3 = new thread(mt,"視窗3");

mt1.start();

mt2.start();

mt3.start();

只建立了乙個myrunnabletest物件,而3個thread執行緒都以同乙個myrunnabletest來啟動,所以他們的資源是共享的。

JAVA多執行緒之Runnable和Thread比較

在我們開發的過程中常常會碰到多執行緒的問題,對於多執行緒的實現方式主要有兩種 實現runnable介面 繼承thread類。對於這兩種多執行緒的實現方式也是有著一些差異。既然實現了多執行緒那必然離不開管理這些執行緒,當問題比簡單時乙個或者幾個執行緒就ok了,也涉及不到效率問題。一旦執行緒數量多起來的...

註解及多執行緒

註解 自定義註解 成員型別受限 基本型別及string class annotation enumeration 註解中成員取名為name 可以用default為成員指定預設值 內建註解 override 重寫 depercateed 過時 suppresswaring 元註解 target 多執行...

VC MFC 多執行緒及執行緒同步

自動事件 cevent類的建構函式,第二個引數為false,是自動事件,自動事件在呼叫setevent函式被使用後能夠自動恢復為無訊號狀態。預設情況下,是自動事件。1 宣告事件為全域性物件。包含使用執行緒同步物件所需要的標頭檔案 include afxmt.h cevent eventobj 構造乙...