Java中的多線程
一、進(jìn)程的概念
進(jìn)程:程序的執(zhí)行過(guò)程,它持有資源(共享內(nèi)存、共享文件)和線程
執(zhí)行過(guò)程:代表著動(dòng)態(tài)性
持有:代表著載體
資源:代表內(nèi)存
二、線程的概念
線程:是程序中最小的執(zhí)行單元
一個(gè)進(jìn)程中可以有多個(gè)線程
多個(gè)線程需要通信才能正常工作稱之為線程的交互,交互的方式又分為兩種:互斥(相互搶奪資源)和同步(相互配合)
栗子(好好吃):進(jìn)程可以類比班級(jí),是學(xué)校的一個(gè)單元(windows上的一個(gè)程序);而線程就是班級(jí)里面的學(xué)生,是班級(jí)里面種最小的一個(gè)執(zhí)行單元(線程),而上體育課(執(zhí)行任務(wù)),打籃球的進(jìn)攻雙方互相搶奪籃球的控制權(quán)(互斥:多線程搶奪CPU的控制權(quán)),而攻守雙方中的球員彼此不會(huì)搶奪己方的籃球控制權(quán)(同步:相互配合,不會(huì)想多CPU的控制權(quán),只有等到籃球傳遞到自己的手上才會(huì)進(jìn)行任務(wù))。
三、Java對(duì)線程的支持(創(chuàng)建以及常見方法)
-
創(chuàng)建方式(4種)
繼承Thread接口
實(shí)現(xiàn)Runnable接口
使用Callable和Future創(chuàng)建線程
通過(guò)線程池獲?。‥xecutor)
-
Tread的常用方法

-
線程的啟動(dòng)
調(diào)用Thread的start()方法啟動(dòng)。
一般這里會(huì)出現(xiàn)面試題:run()方法和start()方法的區(qū)別?
調(diào)用run()方法只是單純的調(diào)用了一個(gè)方法,而start()方法才是線程的正確啟動(dòng)方法。
-
線程的結(jié)束
Thread類中有一個(gè)stop()方法,但是!?。。。。∵@個(gè)stop方法并不推薦使用,究其根本是因?yàn)檫@個(gè)方法是Java1.0提供的,不是說(shuō)他出現(xiàn)的早而不用,而是另有其他的原因:因?yàn)樗鼤?huì)讓我們的線程直接結(jié)束,就相當(dāng)于至接拔掉電腦的電源,你都不知道線程執(zhí)行到了什么地方和完成了什么任務(wù),所以并不推薦這種方式來(lái)結(jié)束掉線程。
正確的結(jié)束方式為:設(shè)置結(jié)束標(biāo)志
-
線程的同步
同步鎖、同步方法、同步代碼塊
常見的面試題:wait()與sleep()的區(qū)別?
- sleep() 方法是線程類(Thread)的靜態(tài)方法,讓調(diào)用線程進(jìn)入睡眠狀態(tài),讓出執(zhí)行機(jī)會(huì)給其他線程,等到休眠時(shí)間結(jié)束后,線程進(jìn)入就緒狀態(tài)和其他線程一起競(jìng)爭(zhēng)cpu的執(zhí)行時(shí)間。 因?yàn)閟leep() 是static靜態(tài)的方法,他不能改變對(duì)象的機(jī)鎖,當(dāng)一個(gè)synchronized塊中調(diào)用了sleep() 方法,線程雖然進(jìn)入休眠,但是對(duì)象的機(jī)鎖沒(méi)有被釋放,其他線程依然無(wú)法訪問(wèn)這個(gè)對(duì)象。
- wait()是Object類的方法,當(dāng)一個(gè)線程執(zhí)行到wait方法時(shí),它就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池,同時(shí)釋放對(duì)象的機(jī)鎖,使得其他線程能夠訪問(wèn),可以通過(guò)notify,notifyAll方法來(lái)喚醒等待的線程