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可能還需要做額外的處理
  • 多執行緒的呼叫是隨機的,如法預估它的執行順序

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)