java之Runnable和Thread區別與實現方法
阿新 • • 發佈:2019-01-26
1、多執行緒中start()和run()方法的區別
1) start:
用start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體程式碼執行完畢而直接繼續執行下面的程式碼。通過呼叫Thread類的 start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,Run方法執行結束,此執行緒隨即終止。
2) run:
run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼,這樣就沒有達到寫執行緒的目的。
2、兩者區別與實現方法
實現Thread
MyThread mt1=new MyThread("執行緒a");
MyThread mt2=new MyThread("執行緒b");
mt1.start();
mt2.start();
實現Runnable
Runnable裡面沒有start方法可以通過Thread類進行啟動Runnable多執行緒
Runnable可以用的同一個物件例項化的,可以資源共享,Thread不可以
MyThread實現runnable介面
MyThread mt=new MyThread();
new Thread (mt).start();
new Thread(mt).start();
new Thread(mt).start();
用runnable啟動一個執行緒
Test impelements Runnable;//定義執行緒類
Test t = new Test();//
//由此行代替前面兩行
Runnable t=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
}
};
Thread test = new Thread(t);
test.start();
runnable的好處:
避免點繼承的侷限,一個類可以繼承多個介面。
適合於資源的共享
3、賣票例子:
Thread方法實現
package Test1;
class MyThread extends Thread{
private int ticket = 10;
private String name;
public MyThread(String name){
this.name =name;
}
public void run(){
for(int i =0;i<500;i++){
if(this.ticket>0){
System.out.println(this.name+"賣票---->"+(this.ticket--));
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt1= new MyThread("一號視窗");
MyThread mt2= new MyThread("二號視窗");
MyThread mt3= new MyThread("三號視窗");
mt1.start();
mt2.start();
mt3.start();
}
}
執行結果
Runnable方法實現
public class Test1 implements Runnable{
private int ticket = 10;
@Override
public void run() {
for(int i =0;i<10;i++){
//新增同步快
synchronized (this){
if(this.ticket>0){
try {
//通過睡眠執行緒來模擬出最後一張票的搶票場景
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"賣票---->"+(this.ticket--));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] arg){
Test1 t1 = new Test1();
new Thread(t1, "執行緒1").start();
new Thread(t1, "執行緒2").start();
}
}
加上synchronized