經(jīng)驗(yàn)分享:對(duì)Java中的線程感想(多線程)
來(lái)源:易賢網(wǎng) 閱讀:1784 次 日期:2016-07-09 13:18:12
溫馨提示:易賢網(wǎng)小編為您整理了“經(jīng)驗(yàn)分享:對(duì)Java中的線程感想(多線程)”,方便廣大網(wǎng)友查閱!

1.進(jìn)程和線程的區(qū)別

通俗一點(diǎn)說(shuō),進(jìn)程就是程序的一次執(zhí)行,而線程可以理解為進(jìn)程中的執(zhí)行的一段程序片段。

用一點(diǎn)文詞說(shuō)就是,每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文);而線程可以看成是輕量級(jí)的進(jìn)程。一般來(lái)講(不使用特殊技術(shù)),同一進(jìn)程所產(chǎn)生的線程共享同一塊內(nèi)存空間。

同一進(jìn)程中的兩段代碼是不可能同時(shí)執(zhí)行的,除非引入線程。

線程是屬于進(jìn)程的,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線程都會(huì)被強(qiáng)制退出并清除。

線程占用的資源要少于進(jìn)程所占用的資源。

進(jìn)程和線程都可以有優(yōu)先級(jí)。

在線程系統(tǒng)中進(jìn)程也是一個(gè)線程。可以將進(jìn)程理解為一個(gè)程序的第一個(gè)線程。

多進(jìn)程——在操作系統(tǒng)中,能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)。

多線程——在同一應(yīng)用程序中,有多個(gè)順序流同時(shí)執(zhí)行。

2.通過(guò)鐵路售票程序來(lái)理解實(shí)現(xiàn)多線程的兩種方法:通過(guò)java.lang.Thread類(lèi)和通過(guò)Runnable接口

java中有兩種實(shí)現(xiàn)多線程的方式。一是直接繼承Thread類(lèi),二是實(shí)現(xiàn)Runnable接口。那么這兩種實(shí)現(xiàn)多線程的方式在應(yīng)用上有什么區(qū)別呢?

為了回答這個(gè)問(wèn)題,我們可以通過(guò)編寫(xiě)一段代碼來(lái)進(jìn)行分析。我們用代碼來(lái)模擬鐵路售票系統(tǒng),實(shí)現(xiàn)通過(guò)四個(gè)售票點(diǎn)發(fā)售某日某次列車(chē)的100張車(chē)票,一個(gè)售票點(diǎn)用一個(gè)線程表示。

我們首先這樣編寫(xiě)這個(gè)程序:

public class ThreadDome1{

public static void main(String[] args){

ThreadTest t = new ThreadTest();

t.start();

t.start();

t.start();

t.start();

}

}

class ThreadTest extends Thread{

private int ticket = 100;

public void run(){

while(true){

if(ticket > 0){

System.out.println(Thread.currentThread().getName() +

"is saling ticket" + ticket--);

}else{

break;

}

}

}

}

上面的代碼中,我們用ThreadTest類(lèi)模擬售票處的售票過(guò)程,run方法中的每一次循環(huán)都將總票數(shù)減1,模擬賣(mài)出一張車(chē)票,同時(shí)該車(chē)票號(hào)打印出來(lái),直接剩余的票數(shù)到零為止。在ThreadDemo1類(lèi)的main方法中,我們創(chuàng)建了一個(gè)線程對(duì)象,并重復(fù)啟動(dòng)四次,希望通過(guò)這種方式產(chǎn)生四個(gè)線程。從運(yùn)行的結(jié)果來(lái)看我們發(fā)現(xiàn)其實(shí)只有一個(gè)線程在運(yùn)行,這個(gè)結(jié)果告訴我們:一個(gè)線程對(duì)象只能啟動(dòng)一個(gè)線程,無(wú)論你調(diào)用多少遍start()方法,結(jié)果只有一個(gè)線程。

我們接著修改ThreadDemo1,在main方法中創(chuàng)建四個(gè)Thread對(duì)象:

public class ThreadDemo1{

public static void main(String[] args){

new ThreadTest().start();

new ThreadTest().start();

new ThreadTest().start();

new ThreadTest().start();

}

}

class ThreadTest extends Thread{

private int ticket = 100;

public void run(){

while(true){

if(ticket > 0){

System.out.println(Thread.currentThread().getName() + 

" is saling ticket" + ticket--);

}else{

break;

}

}

}

}

這下達(dá)到目的了嗎?

從結(jié)果上看每個(gè)票號(hào)都被打印了四次,即四個(gè)線程各自賣(mài)各自的100張票,而不去賣(mài)共同的100張票。這種情況是怎么造成的呢?我們需要的是,多個(gè)線程去處理同一個(gè)資源,一個(gè)資源只能對(duì)應(yīng)一個(gè)對(duì)象,在上面的程序中,我們創(chuàng)建了四個(gè)ThreadTest對(duì)象,就等于創(chuàng)建了四個(gè)資源,每個(gè)資源都有100張票,每個(gè)線程都在獨(dú)自處理各自的資源。

經(jīng)過(guò)這些實(shí)驗(yàn)和分析,可以總結(jié)出,要實(shí)現(xiàn)這個(gè)鐵路售票程序,我們只能創(chuàng)建一個(gè)資源對(duì)象,但要?jiǎng)?chuàng)建多個(gè)線程去處理同一個(gè)資源對(duì)象,并且每個(gè)線程上所運(yùn)行的是相同的程序代碼。在回顧一下使用接口編寫(xiě)多線程的過(guò)程。

public class ThreadDemo1{

public static void main(String[] args){

ThreadTest t = new ThreadTest();

new Thread(t).start();

new Thread(t).start();

new Thread(t).start();

new Thread(t).start();

}

}

class ThreadTest implements Runnable{

private int tickets = 100;

public void run(){

while(true){

if(tickets > 0){

System.out.println(Thread.currentThread().getName() +

" is saling ticket " + tickets--);

}

}

}

}

上面的程序中,創(chuàng)建了四個(gè)線程,每個(gè)線程調(diào)用的是同一個(gè)ThreadTest對(duì)象中的run()方法,訪問(wèn)的是同一個(gè)對(duì)象中的變量(tickets)的實(shí)例,這個(gè)程序滿足了我們的需求。在Windows上可以啟動(dòng)多個(gè)記事本程序一樣,也就是多個(gè)進(jìn)程使用同一個(gè)記事本程序代碼。

可見(jiàn),實(shí)現(xiàn)Runnable接口相對(duì)于繼承Thread類(lèi)來(lái)說(shuō),有如下顯著的好處:

(1)適合多個(gè)相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數(shù)據(jù)有效的分離,較好地體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想。

(2)可以避免由于Java的單繼承特性帶來(lái)的局限。我們經(jīng)常碰到這樣一種情況,即當(dāng)我們要將已經(jīng)繼承了某一個(gè)類(lèi)的子類(lèi)放入多線程中,由于一個(gè)類(lèi)不能同時(shí)有兩個(gè)父類(lèi),所以不能用繼承Thread類(lèi)的方式,那么,這個(gè)類(lèi)就只能采用實(shí)現(xiàn)Runnable接口的方式了。

(3)有利于程序的健壯性,代碼能夠被多個(gè)線程共享,代碼與數(shù)據(jù)是獨(dú)立的。當(dāng)多個(gè)線程的執(zhí)行代碼來(lái)自同一個(gè)類(lèi)的實(shí)例時(shí),即稱(chēng)它們共享相同的代碼。多個(gè)線程操作相同的數(shù)據(jù),與它們的代碼無(wú)關(guān)。當(dāng)共享訪問(wèn)相同的對(duì)象時(shí),即它們共享相同的數(shù)據(jù)。當(dāng)線程被構(gòu)造時(shí),需要的代碼和數(shù)據(jù)通過(guò)一個(gè)對(duì)象作為構(gòu)造函數(shù)實(shí)參傳遞進(jìn)去,這個(gè)對(duì)象就是一個(gè)實(shí)現(xiàn)了Runnable接口的類(lèi)的實(shí)例。

更多信息請(qǐng)查看計(jì)算機(jī)類(lèi)
易賢網(wǎng)手機(jī)網(wǎng)站地址:經(jīng)驗(yàn)分享:對(duì)Java中的線程感想(多線程)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!
相關(guān)閱讀計(jì)算機(jī)類(lèi)
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)