Java中Thread 和Runnable 深刻理解

Thread 和Runnable 關係

Thread類是接口Runnable的一個實現類。安全

public class Thread implements Runnable 
複製代碼

源碼分析

  • Thread Threa類運行的時候調用start()方法,源代碼以下:

調用start()方法,實際運行的是start0方法,方法聲明以下:

private native void start0()
複製代碼

native代表這個方法是個原生函數,即這個函數是用C/C++實現的,被編譯成DLL,由Java調用。 native 方法是在註冊是在Thread對象初始化完成的,如圖,靜態塊static裏有個registerNatives方法,該方法會註冊一些本地方法供Thread類使用。bash

start0方法會在JVM 新建一個線程ide

  • Runnable Runnable 接口只有一個run()方法,徹底是線程運行規範。

代碼實例分析

  • Thread類定義一個賣票的類
public class TicketThread extends Thread {

    private int ticket = 100000;

    @Override
    public void run() {
        for (int i = 0; i < 100000; i++) {
            if (ticket > 0) {
                System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
            }
        }
    }
}
複製代碼

啓動三個線程函數

new TicketThread().start();
new TicketThread().start();
new TicketThread().start();
複製代碼

運行發展每一個線程獨立執行了賣票的任務,每一個線程中票數依次減1。源碼分析

  • Runnable接口實現一個賣票的類
public class TicketRunnableThread implements Runnable {
    private int ticket = 1000;
    public void run() {
        for (int i = 0; i < 1000; i++) {
            if (ticket > 0) {
                System.out.println("ticket=" + ticket-- + "," + Thread.currentThread().getName());
            }
        }
    }
}
複製代碼

啓動三個線程spa

TicketRunnableThread ticketRunnableThread = new TicketRunnableThread();
new Thread(ticketRunnableThread).start();
new Thread(ticketRunnableThread).start();
new Thread(ticketRunnableThread).start();
複製代碼

三個線程共同完成了賣票任務,然而三個線程共同執行同一段代碼,會形成線程不安全,能夠經過加鎖解決。線程

使用選擇

  • 實現Runnable接口的同時,還能夠繼承其餘類,避免Java的單繼承性帶來侷限性。
  • Runnable接口能夠實現資源共享,Thread沒法完成資源共享。
相關文章
相關標籤/搜索