Thread和Runnable的區別
阿新 • • 發佈:2020-07-29
【區別】Thread是類,Runnable是介面。
【聯絡】Thread類實現了Runnable介面
【Thread示例】
class MyThread extends Thread{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ if(this.ticket>0){ System.out.println("賣票:ticket"+this.ticket--); } } } }; public classThreadTicket { public static void main(String[] args) { MyThread mt1=new MyThread(); MyThread mt2=new MyThread(); MyThread mt3=new MyThread(); mt1.start(); mt2.start(); mt3.start(); } }
start方法 VS run方法
- start()用來啟動一個新執行緒,通過Thead類中start()方法來啟動的執行緒處於就緒狀態(可執行狀態),此時並沒有執行,一旦得到CPU時間片,就自動開始執行run()方法。此時不需要等待run()方法執行完也可以繼續執行下面的程式碼。
- run()是在本執行緒裡的,只是執行緒裡的一個函式。如果直接呼叫run(),就相當於是呼叫了一個普通函式,必須等待run()方法執行完畢才能執行下面的程式碼。所以在多執行緒執行時要使用start()方法而不是run()方法。
執行結果
每個執行緒都各賣了10張,共賣了30張票。但實際只有10張票。每個執行緒都賣自己的票,沒有達到資源共享。
【Runnable示例】
class MyThread implements Runnable{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){if(this.ticket>0){ System.out.println("賣票:ticket"+this.ticket--); } } } } public class RunnableTicket { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt).start(); //在Thread中不可以用同一個例項化物件mt,否則就會出現異常 new Thread(mt).start(); new Thread(mt).start(); } };
執行結果:三個執行緒一共賣了10張票,達到了資源共享。
【Runnable比Thread的優勢】
- 避免點繼承的侷限,一個類可以實現多個介面。
- 支援多執行緒間的資源共享