java實(shí)現(xiàn)對(duì)線程編程的方式主要有兩種算撮,一種是繼承Thread萝毛,一種是Runnable接口须喂。
線程的啟動(dòng)并不是簡(jiǎn)單的調(diào)用了run方法,而是由一個(gè)線程調(diào)度器來(lái)分別調(diào)用所有線程的run方法责语。如果直接調(diào)用Thread實(shí)例的run方法贴硫,則不能起到多線程的作用椿每,因?yàn)樗鼤?huì)在當(dāng)前運(yùn)行的線程中執(zhí)行,而不是啟動(dòng)一個(gè)新的線程去執(zhí)行英遭。線程里的run方法只有一定的CPU時(shí)間,執(zhí)行過(guò)后就給別的線程了,這樣反復(fù)的被CPU切來(lái)切去间护。
而start()方法的調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程變?yōu)榭蛇\(yùn)行態(tài)(Runnable)挖诸,什么時(shí)候運(yùn)行是由操作系統(tǒng)決定的汁尺。
Runnable接口和Thread之間的聯(lián)系:
public classThread extendsObject implementsRunnable
看源碼可以發(fā)現(xiàn)Thread類(lèi)也是Runnable接口的子類(lèi)。
Runnable接口和Thread之間的區(qū)別:
實(shí)現(xiàn)Runnable接口比繼承Thread類(lèi)所具有的優(yōu)勢(shì):
1):適合多個(gè)相同的程序代碼的線程去處理同一個(gè)資源
2):可以避免java中的單繼承的限制
3):增加程序的健壯性多律,代碼可以被多個(gè)線程共享痴突,代碼和數(shù)據(jù)獨(dú)立
關(guān)于資源共享參照賣(mài)票的例子。
以賣(mài)票程序?yàn)槔擒瘢ㄟ^(guò)Thread類(lèi)完成:
classMyThread extendsThread{
private int ticket=10;
public void run(){
????for(int i=0;i<20;i++){
? ? ????if(this.ticket>0){
????????????System.out.println("賣(mài)票:ticket"+this.ticket--);
????????}
????}
}
下面通過(guò)三個(gè)線程對(duì)象辽装,同時(shí)賣(mài)票:
public class ThreadTicket {
????public static void main(String[] args) {
????????MyThread mt1=newMyThread();
????????MyThread mt2=newMyThread();
????????MyThread mt3=newMyThread();
????????mt1.start();//每個(gè)線程都各賣(mài)了10張,共賣(mài)了30張票
????????mt2.start();//但實(shí)際只有10張票相味,每個(gè)線程都賣(mài)自己的票
????????mt3.start();//沒(méi)有達(dá)到資源共享
????}
}
如果用Runnable就可以實(shí)現(xiàn)資源共享拾积,下面看例子:
class MyThread implements Runnable{
????private intt icket=10;
????public void run(){
????????for(inti=0;i<20;i++){
????????????if(this.ticket>0){
????????????????System.out.println("賣(mài)票:ticket"+this.ticket--);
????????????}
????????}
????}
}
Run類(lèi)
public class RunnableTicket {
????public static void main(String[] args) {
? ? ????MyThread mt=newMyThread();
????????newThread(mt).start();//同一個(gè)mt,但是在Thread中就不可以,如果用同一
????????newThread(mt).start();//個(gè)實(shí)例化對(duì)象mt殷勘,就會(huì)出現(xiàn)異常
????????newThread(mt).start();
????}
}
雖然現(xiàn)在程序中有三個(gè)線程此再,但是一共賣(mài)了10張票,也就是說(shuō)使用Runnable實(shí)現(xiàn)多線程可以達(dá)到資源共享目的玲销。