Java Thread和Runnable的執行差異
文章目的
了解Java多執行緒操作中,Thread和Runnable的差異
- 實作多個Thread
- 實作多個Runnable
如何實作可以參考Java Thread的基礎實踐方法
實作多個Thread
原始碼
class MyThread extends Thread{
private int ticket = 5;
public void run(){
for (int i=0;i<10;i++)
{
if(ticket > 0){
System.out.println("ticket = " + ticket--);
}
}
}
public static void main(String[] args){
new MyThread().start();
new MyThread().start();
new MyThread().start();
}
}
Result
ticket = 5
ticket = 4
ticket = 3
ticket = 5
ticket = 4
ticket = 5
ticket = 3
ticket = 2
ticket = 1
ticket = 2
ticket = 4
ticket = 3
ticket = 2
ticket = 1
ticket = 1
解析
透過原始碼與結果可以看到
- 多執行緒的呼叫是隨機的,所以在Result階段並沒有如實的呈現規律的5~1排列
- 每個執行續使用的資源(ticket)都是獨一歸屬個別執行緒的。
- 所以假設今天的業務邏輯是,活動商要賣出五張票,如果使用了如上方一樣的三個執行緒,那結果可能會賣出15張超賣了10張
實作多個Runnable
原始碼
public class MyRunnable implements Runnable {
private int ticket = 5;
public void run(){
for (int i=0;i<10;i++)
{
if(ticket > 0){
System.out.println("ticket = " + ticket--);
}
}
}
public static void main(String[] args){
MyRunnable my = new MyRunnable();
new Thread(my).start();
new Thread(my).start();
new Thread(my).start();
}
}
Result
ticket = 5
ticket = 3
ticket = 2
ticket = 1
ticket = 4
解析
透過原始碼與結果可以看到
- 與實作Thread一樣,多執行緒的呼叫是隨機的,所以在Result階段並沒有如實的呈現規律的5~1排列
- 和Thread不同在於,每個執行緒使用的資源(ticket)是*共通的。
- 所以假設今天的業務邏輯是,活動商要賣出五張票,那使用Runnable這樣的實踐方式可以很簡單的對應到業務邏輯,賣出五張票不需做多餘的調整。
結論
- Thread和Runnable的差異在於,Runnable可以簡單的讓多執行緒處理同一份資源,而Thread可能還需要做額外的處理
- 多執行緒的呼叫是隨機的,如法預估它的執行順序
留言
張貼留言