contents
<a target="_blank" href="https://github.com/brianway/java-learning/blob/master/javase/java%e5%9f%ba%e7%a1%80%e5%b7%a9%e5%9b%ba%e7%ac%94%e8%ae%b0(5)-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b9%8b%e4%bc%a0%e7%bb%9f%e5%a4%9a%e7%ba%bf%e7%a8%8b.md#%e4%bc%a0%e7%bb%9f%e7%ba%bf%e7%a8%8b%e6%8a%80%e6%9c%af">傳統線程技術</a>
<a target="_blank" href="https://github.com/brianway/java-learning/blob/master/javase/java%e5%9f%ba%e7%a1%80%e5%b7%a9%e5%9b%ba%e7%ac%94%e8%ae%b0(5)-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b9%8b%e4%bc%a0%e7%bb%9f%e5%a4%9a%e7%ba%bf%e7%a8%8b.md#%e4%bc%a0%e7%bb%9f%e5%88%9b%e5%bb%ba%e7%ba%bf%e7%a8%8b%e6%96%b9%e5%bc%8f">傳統建立線程方式</a>
<a target="_blank" href="https://github.com/brianway/java-learning/blob/master/javase/java%e5%9f%ba%e7%a1%80%e5%b7%a9%e5%9b%ba%e7%ac%94%e8%ae%b0(5)-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b9%8b%e4%bc%a0%e7%bb%9f%e5%a4%9a%e7%ba%bf%e7%a8%8b.md#%e4%bc%a0%e7%bb%9f%e5%ae%9a%e6%97%b6%e5%99%a8%e6%8a%80%e6%9c%af">傳統定時器技術</a>
<a target="_blank" href="https://github.com/brianway/java-learning/blob/master/javase/java%e5%9f%ba%e7%a1%80%e5%b7%a9%e5%9b%ba%e7%ac%94%e8%ae%b0(5)-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b9%8b%e4%bc%a0%e7%bb%9f%e5%a4%9a%e7%ba%bf%e7%a8%8b.md#%e4%ba%92%e6%96%a5">互斥</a>
<a target="_blank" href="https://github.com/brianway/java-learning/blob/master/javase/java%e5%9f%ba%e7%a1%80%e5%b7%a9%e5%9b%ba%e7%ac%94%e8%ae%b0(5)-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b9%8b%e4%bc%a0%e7%bb%9f%e5%a4%9a%e7%ba%bf%e7%a8%8b.md#%e5%90%8c%e6%ad%a5">同步</a>
1.繼承thread類,覆寫run方法
2.實作runnable接口
runnable不是線程,是線程要運作的代碼的宿主。
1.看看thread類源碼,捋清runnable,target,run,start關系
<code>runnable</code>是一個接口
<code>target</code>是<code>thread</code>類中類型為<code>runnable</code>,名為<code>target</code>的屬性
<code>run</code>是<code>thread</code>類實作了<code>runnable</code>的接口,重寫的方法。
<code>start</code>是啟動線程的方法
在<code>thread</code>類中,調用關系為:<code>start</code>-><code>start0</code>-><code>run</code>-><code>target.run</code>
<code>thread</code>類的<code>run</code>方法源碼
<code>thread</code>類的<code>target</code>屬性
<code>target</code>屬性由<code>private void init(threadgroup g, runnable target, string name,long stacksize, accesscontrolcontext acc)</code>方法初始化。<code>init</code>方法在<code>thread</code>類的構造方法裡被調用
2.匿名内部類對象的構造方法如何調用父類的非預設構造方法
api:
<a target="_blank" href="https://docs.oracle.com/javase/8/docs/api/index.html?java/util/timer.html">java.util:class timer</a>
例子:一個定時器實作交替2秒、3秒列印
可以使用<code>quarlz</code>開源工具
關鍵字:<code>synchronized</code>,檢查鎖對象
<code>synchronized(this)</code>
<code>synchronized void function(){}</code>
<code>synchronized(a.class)</code>
經驗:
要用到共同資料(包括同步鎖)或共同算法的若幹個方法應該歸在同一個類身上,這種設計展現了高聚類和程式的健壯性。 同步互斥不是線上程上實作,而是線上程通路的資源上實作,線程調用資源。
例子: 子線程循環5次,主線程循環10次,如此交替50次
設計:
使用一個business類來包含子線程和主線程要運作的代碼,進而,該類的對象成為加鎖的對象。同步互斥在該類實作,由線程調用該類的方法,即調用了資源。
代碼:
判斷條件時,while與if的差別:while防止僞喚醒