Java多线程——多线程的基本概念和使用
一、進(jìn)程和線程的基礎(chǔ)知識(shí)
1、進(jìn)程和線程的概念
進(jìn)程:運(yùn)行中的應(yīng)用程序稱為進(jìn)程,擁有系統(tǒng)資源(cpu、內(nèi)存)
線程:進(jìn)程中的一段代碼,一個(gè)進(jìn)程中可以有多段代碼。本身不擁有資源(共享所在進(jìn)程的資源)
在java中,程序入口被自動(dòng)創(chuàng)建為主線程,在主線程中可以創(chuàng)建多個(gè)子線程。
區(qū)別:
?1、是否占有資源問(wèn)題
?2、創(chuàng)建或撤銷一個(gè)進(jìn)程所需要的開(kāi)銷比創(chuàng)建或撤銷一個(gè)線程所需要的開(kāi)銷大。
?3、進(jìn)程為重量級(jí)組件,線程為輕量級(jí)組件
?
多進(jìn)程:?在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)
多線程:?在同一應(yīng)用程序中有多個(gè)功能流同時(shí)執(zhí)行
?
2、線程的主要特點(diǎn)
①、不能以一個(gè)文件名的方式獨(dú)立存在在磁盤中;
②、不能單獨(dú)執(zhí)行,只有在進(jìn)程啟動(dòng)后才可啟動(dòng);
③、線程可以共享進(jìn)程相同的內(nèi)存(代碼與數(shù)據(jù))。
?
3、線程的主要用途
①、利用它可以完成重復(fù)性的工作(如實(shí)現(xiàn)動(dòng)畫、聲音等的播放)。
②、從事一次性較費(fèi)時(shí)的初始化工作(如網(wǎng)絡(luò)連接、聲音數(shù)據(jù)文件的加載)。
③、并發(fā)執(zhí)行的運(yùn)行效果(一個(gè)進(jìn)程多個(gè)線程)以實(shí)現(xiàn)更復(fù)雜的功能
?
4、多線程(多個(gè)線程同時(shí)運(yùn)行)程序的主要優(yōu)點(diǎn)
①、可以減輕系統(tǒng)性能方面的瓶頸,因?yàn)榭梢圆⑿胁僮?#xff1b;
②、提高CPU的處理器的效率,在多線程中,通過(guò)優(yōu)先級(jí)管理,可以使重要的程序優(yōu)先操作,提高了任務(wù)管理的靈活性;另一方面,在多CPU系統(tǒng)中,可以把不同的線程在不同的CPU中執(zhí)行,真正做到同時(shí)處理多任務(wù)。
?
?
二、線程的創(chuàng)建和啟動(dòng)
其實(shí)看看API,從Thread的構(gòu)造方法,就可以看出創(chuàng)建一個(gè)線程的方式:
| Thread() ??????????分配新的?Thread?對(duì)象。 |
| Thread(Runnable?target) ??????????分配新的?Thread?對(duì)象。 |
| Thread(Runnable?target,String?name) ??????????分配新的?Thread?對(duì)象。 |
| Thread(String?name) ??????????分配新的?Thread?對(duì)象。 |
| Thread(ThreadGroup?group,Runnable?target) ??????????分配新的?Thread?對(duì)象。 |
| Thread(ThreadGroup?group,Runnable?target,String?name) ??????????分配新的?Thread?對(duì)象,以便將?target?作為其運(yùn)行對(duì)象,將指定的?name?作為其名稱,并作為?group?所引用的線程組的一員。 |
| Thread(ThreadGroup?group,Runnable?target,String?name, long?stackSize) ??????????分配新的?Thread?對(duì)象,以便將?target?作為其運(yùn)行對(duì)象,將指定的?name?作為其名稱,作為?group?所引用的線程組的一員,并具有指定的堆棧大小。 |
| Thread(ThreadGroup?group,String?name) ??????????分配新的?Thread?對(duì)象。 |
?
后面4個(gè)構(gòu)造方法創(chuàng)建一個(gè)線程并加入到一個(gè)線程組中,但是創(chuàng)建線程的方式和前面的相似。
java中創(chuàng)建一個(gè)線程有兩種方式:
1、繼承Thread類,重寫run()方法,然后直接new這個(gè)對(duì)象的實(shí)例,創(chuàng)建一個(gè)線程的實(shí)例。然后調(diào)用start()方法啟動(dòng)線程
2、實(shí)現(xiàn)Runnable接口,重寫run()方法,然后調(diào)用new Thread(runnable)的方式創(chuàng)建一個(gè)線程,然后調(diào)用start()方法啟動(dòng)線程
其實(shí)看Thread的源文件,發(fā)現(xiàn)它也是實(shí)現(xiàn)了Runnable接口的。
?
[java]?view plain?copy
1、繼承Thread類的方式
?
?
[java]?view plain?copy
2、實(shí)現(xiàn)Runnable接口
?
?
[java]?view plain?copy
注意:
?
①、在繼承Thread的方式中,可以使用getName()方法,來(lái)獲得當(dāng)前線程的名字,這是因?yàn)樵赥hread類中,有這個(gè)方法。可是在實(shí)現(xiàn)Runnable方式中,卻不可以使用this.getName(),因?yàn)镽unnable接口沒(méi)有這個(gè)方法(可以看出來(lái),因?yàn)槲覀儧](méi)有提示我們需要重寫這個(gè)方法),所以只能通過(guò)Thread的靜態(tài)方法Thread.currentThread()取得當(dāng)前的Thread對(duì)象,在調(diào)用getName()方法,來(lái)取得當(dāng)前線程的名字。
②、對(duì)Java來(lái)說(shuō),run()方法沒(méi)有任何特別之處。像main()方法一樣,它只是新線程知道調(diào)用的方法名稱(和簽名)。因此,在Runnable上或者Thread上調(diào)用run方法是合法的。但并不啟動(dòng)新的線程。只有調(diào)用start()方法才會(huì)啟動(dòng)新線程。
3、兩種方式的對(duì)比
采用實(shí)現(xiàn)Runnable接口方式的多線程具有優(yōu)勢(shì),一般都會(huì)使用這種方式:
1、線程類只是實(shí)現(xiàn)了Runnable接口,還可以繼承其他類。
2、在這種方式下,可以多個(gè)線程共享一個(gè)Runnable target對(duì)象,所以非常適合多個(gè)相同線程來(lái)處理同一份資源的情況,從而可以將CPU、代碼和數(shù)據(jù)分開(kāi),形成清晰的模型,較好的體現(xiàn)了面向?qū)ο蟮乃枷搿?/p>
總結(jié)
以上是生活随笔為你收集整理的Java多线程——多线程的基本概念和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查看mysql当前表使用的存储引擎(转)
- 下一篇: 今天介绍一款强大的服务器开发工具(JRe