線程
線程是進(jìn)程中的一個(gè)實(shí)體,進(jìn)程的一個(gè)執(zhí)行路徑
是CPU調(diào)度和分派執(zhí)行的基本單位
線程本身是不會(huì)獨(dú)立存在的
系統(tǒng)不會(huì)為線程分配內(nèi)存,每個(gè)線程有自己的棧資源陈哑,用于存儲(chǔ)該線程的局部變量妻坝,其它線程是無權(quán)訪問的伸眶。
每一個(gè)線程都是進(jìn)程的一個(gè)執(zhí)行路徑,所以線程之間可以共享所屬進(jìn)程的資源
多線程
解決多個(gè)任務(wù)同時(shí)執(zhí)行的需求,合理利用CPU的資源惠勒。
多線程的運(yùn)行是根據(jù)CPU的切換來完成的赚抡,如何切換由CPU來完成,因此多線程運(yùn)行具有不確定性纠屋。
線程池
在未引入線程池之前涂臣,我們使用線程時(shí)就去創(chuàng)建一個(gè)線程,這樣實(shí)現(xiàn)起來非常方便售担,但是就會(huì)有一個(gè)問題:
如果并發(fā)的線程數(shù)量很多赁遗,并且每個(gè)線程都是執(zhí)行一個(gè)時(shí)間很短的任務(wù)就結(jié)束了,這樣頻繁創(chuàng)建線程就會(huì)大大降低系統(tǒng)的效率族铆,因?yàn)轭l繁創(chuàng)建線程和銷毀線程需要時(shí)間岩四。那么有沒有一種辦法使得線程可以復(fù)用,就是執(zhí)行完一個(gè)任務(wù)哥攘,并不被銷毀剖煌,而是可以繼續(xù)執(zhí)行其他的任務(wù)?
在Java中可以通過線程池來達(dá)到這樣的效果逝淹。
基本思想還是一種對(duì)象池的思想耕姊,開辟一塊內(nèi)存空間,里面存放了眾多(未死亡)的線程栅葡,池中線程執(zhí)行調(diào)度由池管理器來處理茉兰。當(dāng)有線程任務(wù)時(shí),從池中取一個(gè)欣簇,執(zhí)行完成后線程對(duì)象歸池规脸,這樣可以避免反復(fù)創(chuàng)建線程對(duì)象所帶來的性能開銷,節(jié)省了系統(tǒng)的資源熊咽。
1.創(chuàng)建線程的兩種方式
①繼承自Thread類莫鸭,重寫run()方法
classDemoThreadextendsThread{ @Overridepublicvoidrun(){ super.run(); }}DemoThread t = newDemoThread();t.start();
繼承Thread類,覆蓋run()方法网棍。
創(chuàng)建線程對(duì)象并用start()方法啟動(dòng)線程黔龟。
多線程
多線程的概念很好理解就是多條線程同時(shí)存在,但要用好多線程確不容易滥玷,涉及到多線程間通信,多線程共用一個(gè)資源等諸多問題巍棱。
使用多線程的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1)適當(dāng)?shù)奶岣叱绦虻膱?zhí)行效率(多個(gè)線程同時(shí)執(zhí)行)惑畴。
2)適當(dāng)?shù)奶岣吡速Y源利用率(CPU、內(nèi)存等)航徙。
缺點(diǎn):
1)占用一定的內(nèi)存空間如贷。
2)線程越多CPU的調(diào)度開銷越大。
3)程序的復(fù)雜度會(huì)上升。