先看例子:###
/**實現Runnable接口創建線程步驟:
* 1、創建一個實現Runnable接口的類
* 2、重寫Runnable類中抽象的run()方法
* 3、創建實現類的對象
* 4、聲明Thread類,同時將實現類對象作為參數傳遞
* 5、用Thread類的對象調用start()
*/
//例子:多線程售票(暫未安全同步)
class MyThread implements Runnable{
private int num = 100;
public void run(){
while (true){
System.out.println(Thread.currentThread().getName()+"票號:"+num--);
if(num == 0)
break;
}
}
}
public class ThreadTest2 {
public static void main(String[] args) {
//m相當於是提供了線程所要執行的run(),所以可以供不同線程調用
MyThread myThread = new MyThread();
//將Runnable實現類的對象傳遞給Thread類中的Runnable類型的屬性,由此調實現用
Thread t = new Thread(myThread);
Thread t1 = new Thread(myThread);
Thread t2 = new Thread(myThread);
//設置線程名
t.setName("窗口1:");
t1.setName("窗口2:");
t2.setName("窗口3:");
//通過調用start執行myThread對象的run(),實現三個線程共用一個方法,但是對象始終只有一個,記錄票數的子類也只有一個
t.start();
t1.start();
t2.start();
}
}
解析:
通過源碼發現Thread類也實現了Runnable接口,通過所以此創建實例的過程是一個Runnable的實現類對象(myThread),傳遞給另一個Runnable實現類對象(t、t1、t2)的過程,而Thread類中還定義了個Runnable類型的屬性,用於配合接收Thread類的帶參構造器傳遞過來的Runnable類型的對象,現在對象有了,要調用什么姿勢還不是拍拍屁股的事情?(實際是Thread類中的run()判斷出有Runnable對象傳遞進來了,就通過該對象調用run())
補充:忽略安全同步問題,例子實現了多線程售票,可以看出start()方法負責開啟線程並調用負責線程執行內容的run()方法。