如何建立乙個控制單元或執行緒?
第一種方式:
1、繼承thread類。覆蓋run方法,將多執行緒要執行的**放到run方法中。
2、呼叫start方法,開啟執行緒,並執行run方法。
※特性:隨機性(每次執行的結果不一樣,多個執行緒搶資源的結果)
※建立乙個thread類或其子類,才能夠產生乙個控制單元.
第二種方式:
1、實現runnable介面,覆蓋run方法.
2、呼叫thread類建立執行緒物件,並將實現runnable介面的子類物件作為引數傳遞給thread的建構函式.
3、呼叫thread類物件的start方法,開啟並執行run方法.
為什麼要將runnable介面的子類物件作為引數傳遞給thread類的構造方法呢?為了讓多執行緒去執行自定義的run方法,該
run方法有自己所屬的物件,所以將該物件傳入.
執行緒的安全問題,產生的原因:
1、多個執行緒訪問出現延遲;
2、執行緒的隨機性;
同步:1、解決執行緒的安全問題,同時會消耗資源,降低效率(每個執行緒都需要去判斷同步上的鎖). 例子:火車上的衛生間(鎖);
2、需要同步的兩個前提:①至少兩個以上的執行緒;②多執行緒使用的是同一把鎖;
3、注意同步的死鎖,盡量避免同步巢狀的情況.
4、同步的兩種表現形式:
①同步**塊,傳遞乙個物件作為鎖.
②同步函式,使用this作為鎖。使用同步函式時,一定要注意分析哪些需要同步,在tickets中,如將synchronized放到run方法上,
那麼執行緒進入while無限迴圈,無法退出,鎖無法被其他執行緒使用.所以,while迴圈不需要同步,而其中的內容才是需要同步的內容.
2、靜態方法的同步函式,鎖肯定不是this,因為靜態方法不能使用this,這是,鎖為方法所在的類的class物件,例如,tickets.class.
class mythread extends thread
public void run() //覆蓋run方法}}
//鐵路售票例子,四個視窗同時售票
class tickets implements runnable
}else
catch (exception e)
system.out.println(thread.currentthread().getname() + " ->code.... " +ticketscnt--); }}
} }}public synchronized static void show() //同步函式,新增關鍵字synchronized,鎖為this,如果宣告為static,則鎖為tickets.class
catch (exception e)
system.out.println(thread.currentthread().getname() + " ->func.... " +ticketscnt--); }}
}class threaddemo
tickets t = new tickets();
thread t1 = new thread(t);
thread t2 = new thread(t);
//thread t3 = new thread(t);
//thread t4 = new thread(t);
t1.start();
trycatch (exception e)
t.b = false;
t2.start();
java中的執行緒
執行緒學習 兩種方法建立執行緒,通常使用第二種方法更加靈活,主要是第二種方法適合多個相同程式的執行緒去處理同一資源的情況,即建立多個執行緒,傳入同乙個物件,就是對該物件同時用多個執行緒進行處理。1.建立thread類的物件就是建立了乙個執行緒,thread類中的run方法是空的,通常繼承thread...
java中的多執行緒
package testthread 店員從生產者取貨,消費者從店員取貨,店員最多只能存放20個產品,當產品不夠20個需通知生產者生產,超過20個時停止消費 author passenger 店員類 class clerk catch interruptedexception e else 消費產品...
java中的多執行緒
建立執行緒的第一種方法 繼承thread類。步驟 1,定義乙個類繼承thread 2,複寫thread類中的run方法 目的 將自定義 儲存在run方法中,讓執行緒執行 3,呼叫執行緒的start方法,該方法用兩個作用 啟動執行緒,呼叫run方法 多執行緒的特性 隨機性 示例 class demo ...