1、Runnable是一個接口,當實現該接口時需要復用run方法,在run方法中實現自己的邏輯。
2、Thread是一個類,它其實實現了Runnable方法,也就是說當你通過new 一個Thread得到一個線程實例時,其實就是重寫runnable裡面的run方法。當你通過實現runnable創建一個線程實例時,你需要將runnable實例傳遞一個thread,然後通過.start開啟線程。
3、Runnable可以線程同步,但是Thread不可以線程同步,例如一共有10張票,你可以開啟3個線程同時賣票,如果你通過繼承thread創建一個賣票的類,實例化3個線程會各自賣10張票,一共就賣出了30張,當時你通過實現runnable所創建的賣票類,只需要實例化一個對象,將一個對象傳遞給三個thread,然後開啟三個線程,你會發現三個線程一共只會賣10張。
4、以下是賣票的代碼
package com.shine.test; /** * 通過繼承thread的賣票類 * @author ASUS * */ public class MyThread extends Thread { public int ticks = 10; boolean flag = true; public MyThread(String string) { this.setName(string); } @Override public void run() { while(flag){ saleTick(); } } public void saleTick() { if(ticks > 0){ ticks--; System.out.println(Thread.currentThread().getName()+":"+ticks); }else{ flag = false; } } }
package com.shine.test; /** * 通過實現Runnable的賣票類 * @author ASUS * */ public class MyRunnable implements Runnable { public int ticks = 10; boolean flag = true; @Override public void run() { while(flag){ saleTick(); } } public void saleTick() { if(ticks > 0){ ticks--; System.out.println(Thread.currentThread().getName()+":"+ticks); }else{ flag = false; } } }
package com.shine.test; public class Test { /**測試 * @param args */ public static void main(String[] args) { MyThread myThread1 = new MyThread("thread1"); MyThread myThread2 = new MyThread("thread2"); MyThread myThread3 = new MyThread("thread3"); myThread1.start(); myThread2.start(); myThread3.start(); MyRunnable myRunnable = new MyRunnable(); Thread runnable1 = new Thread(myRunnable); Thread runnable2 = new Thread(myRunnable); Thread runnable3 = new Thread(myRunnable); runnable1.setName("runnable1"); runnable2.setName("runnable2"); runnable3.setName("runnable3"); runnable1.start(); runnable2.start(); runnable3.start(); } }
結果:
thread1:9 thread1:8 thread1:7 thread1:6 thread1:5 thread1:4 thread1:3 thread1:2 thread1:1 thread1:0 thread2:9 thread2:8 thread2:7 thread2:6 thread2:5 thread2:4 thread2:3 thread2:2 thread2:1 thread2:0 thread3:9 runnable1:9 runnable1:8 runnable1:7 runnable1:6 runnable1:5 runnable1:4 runnable1:3 runnable1:2 runnable1:1 runnable1:0 thread3:8 thread3:7 thread3:6 thread3:5 thread3:4 thread3:3 thread3:2 thread3:1 thread3:0
由於系統自身的線程選擇問題 全部由runnable1完成了賣票 但總共只賣出了10張 thread的則賣出了30張