一、進程和線程的區別
1,進程和線程都有三種基本狀態:就緒,運行,阻塞
2,從資源的角度講:進程是擁有資源的基本單位,線程可以共享其隸屬進程的系統資源。
3,從調度的角度講:線程是cpu調度的基本單位。
4,從系統開銷的角度講:進程由程序、數據、進程控制塊三部分組成。每次創建進程,系統都要為之分配或回收資源,如內存、io等。
線程由線程ID、當前指令指針、寄存器集合和堆棧等組成,線程切換只需要保存和設置少量寄存器變量,因此系統開銷小。
5,從通信方面:進程通信需要依靠操作系統,而線程可以直接讀寫進程數據段(全局變量)來進行通信。
進程通信可以采用的方法有:管道、信號、信號量、消息隊列、共享內存、狀態變量、套接字(socket)<不同機器之間>
線程通信貌似也有類似的一些東西
二、java中多線程的實現方式
1,線程創建
1.1繼承Thread
1)定義Thread的子類,實現run()方法
2)創建Thread子類的對象 [創建之后,線程處於新建狀態]
3)調用線程對象的start方法 [線程處於就緒狀態]
1.2實現runnable或者callable
1)定義類,實現runnable接口,重寫run方法
2)創建上述類類的對象 [創建之后,線程處於新建狀態]
3)不直接調用上述對象的start方法,而是將其作為target。new Thread(對象).start() [線程處於就緒狀態]
2,控制線程的相關方法
1)join 讓一個線程等待另一個線程完成。調用后,當前線程阻塞,直到被調用的線程執行結束。
2)sleep讓線程休眠,由運行態進入阻塞態。
3)yield讓線程重新調度,有運行態進入就緒態。
3,線程同步
1)同步代碼塊,利用Synhronized(obj){}修飾一段代碼
2)同步方法,將方法使用Synhronized修飾
3)同步鎖Lock,和同步方法比較類似,只是同步鎖顯示使用Lock對象作為同步鎖
4,線程通信
1)全局變量
2)使用Object類的三個方法:該方法有同步監視器對象調用
wait:導致當前進程等待
notify:喚醒在該同步監視器上等待的進程(隨機選一)
notifyAll:喚醒在該同步監視器上等待的所有進程