停止線程
-----------
1、定義循環結束標記
.因爲線程運行代碼一般都是循環,只要控制了循環即可
2、使用interrupt(中斷)方法
.該方法是結束線程的凍結狀態,使線程回到運行狀態中來
注:stop方法已經過時不再使用
創建線程方式
--------------------
1、Thread
2、Runnable{public void run();}
例子:class Man extends Person implements Runnable{ //Man雖然具備有執行功能了,但它不是線程必須newThread這個參數可以傳遞一個Runnable接口的對象 ———》》new Thread(new Man()).start();如果運行的話還得託付Thread函數
public void run(){
.................
}
}
new Car().start();
new Thread(new Man()).start();
sleep和監控權沒有任何的關係
------------------------------------
創建線程方式二
-----------------
實現Runnable接口
1、子類覆蓋安接口中的run方法
2、通過Thread類創建線程,並將實現了Runnable接口的子類對象作爲參數傳遞給Thread
類的構造函數
3、Thread類對象調用start方法開啓線程
思考:爲什麼要給Thread類的構造函數傳遞Runnable的子類對象?
答:用一個存在的類具備線程的功效,就不繼承Thread了,只能通過其他的手段加以實現。只能實現一個Runnable接口
重寫方法後才能調用父類的方法即:new一個對象後才行
-------------------------------------------------
線程安全問題
-----------
導致安全問題的出現的原因:
1、多個線程訪問出現延時
2、線程隨機性
注意:線程安全問題在理想狀態下,不容易出現,但一旦出現對軟件的影響是非常大的
-------------
同步(synchronized)
格式:
synchronized(對象){
需要同步的代碼
}
同步可以解決安全問題的根本原因就在那個對象上。該對象如同鎖定的功
同步的特點:
-------------
同步的前提:
1、同步需要兩個或者兩個以上的線程
2、多個線程使用的是同一個鎖
未瞞足這兩個條件,不能稱其爲同步
同步的弊端:
當線程相當多時,因爲每個線程都會去判斷同步上的鎖,這是很耗費資源的,無形中會降低程序的運行效率
線程間通信
——————-
思考:wait(),notify(),notifyAll(),用來操作線程爲什麼定義在object類中?
答:1、這些方法存在與同步中。2、使用這些方法時必須要標識所屬的同步的鎖。3、鎖可以是任意對象
所以任意對象調用的方法一定定義object類中。
思考2:wait(),sleep()有什麼區別?
wait():釋放cpu執行權,釋放鎖
sleep():釋放cpu執行權,不釋放鎖
yield():等待指定的線程執行完後繼續執行
notify通知去權
併發是同時執行————要考慮到線程的安全性
線程的其他方法 優先級
---------------
1、setPriority(int num)---》》優先級
2、setDaemon(booleanb)———》》守護線程 ———》如果一個程序中都是守護線程的話就會結束了
3、join()--》當子線程運行後再運行主線程,也就是使它們有序進行
4、自定義線程名稱
5、toString ———》是toString方法