1,建立乙個任務
實現runnable介面,並重寫run()方法
class
myrunnable
implements
runnable
}
2,建立執行緒
<1>建立乙個類,繼承thread類,並重寫run()方法,建立此類物件。
<2>實現runnable介面,並重寫run()方法,利用thread類的構造方法,傳入此類。
public
class
t1 }
class
myrunnable
implements
runnable
}class
mythread
extends
thread
}
3,啟動執行緒
呼叫執行緒物件的start()方法
public
class t1
}
4,同步鎖
例:
用**實現,視窗
一、視窗
二、兩個視窗同時進行買票(總共十張票)
public
class
ticketdemo
}class
mimplements
runnable
ticket--;
system.out.println(thread.currentthread().getname()+
"售出第" + (10-ticket)+"票");
//為體現出交替買票的效果,賣出一張票之後,執行緒睡眠10毫秒,讓另乙個視窗搶到cpu執行權
try catch (interruptedexception e) }}
}
執行結果為:
下面的**使用了同步鎖
public
class
ticketdemo
}class
mimplements
runnable
ticket--;
system.out.println(thread.currentthread().getname()+
"售出第" + (10-ticket)+"票");
}//在此地方釋放唯一鎖
//為體現出交替買票的效果,賣出一張票之後,執行緒睡眠10毫秒,讓另乙個視窗搶到cpu執行權
try catch (interruptedexception e) }}
}class
lock
執行結果為:
在使用同步鎖時一定要注意,鎖是否是唯一的!
5,同步方法
1,同步方法的監視器是this
2,在同乙個物件中,執行緒在呼叫同步方法的時候,其他的同步方法無法執行(因為this沒有被釋放)
6,執行緒狀態
<1>建立
(1)當new乙個thread時,執行緒就被建立了出來。
<2>就緒
(1)當執行緒呼叫start()方法後,就進入了就緒狀態,隨時準備搶奪cpu執行權
<3>阻塞
(1)在,當前執行緒呼叫thread.sleep(時間t)方法時,在時間t內,呼叫此方法所在的執行緒一直處於阻塞狀態,直到經過時間t後重新進入就緒狀態
(2)當執行緒要執行同步**塊而沒有lock的時候,進入阻塞狀態,直到拿到lock才進入執行狀態
(3)在,當前執行緒中的物件執行wait()方法時,表示進入阻塞狀態,只有當另乙個執行緒內的此物件執行notify()方法後,才被喚醒,重新進入就緒態。應當注意的是,此兩種方法是屬於object類內的。而不是thread類內。此外,這兩句**執行時,不允許可能會出現其他的執行緒進行同步執行,所以這兩句**一定要在同步**塊中執行。
當多個執行緒中的此物件都在等待時間,可以使用notifyall()方法,使之全部喚醒。
下面是乙個使用wait()方法和notify()方法的乙個小例子。
/*
* wait()方法會釋放當前鎖(wait()方法表示當前物件資源沒有準備好)
* notify()(通知當前物件資源已經準備好了)
* * 題目:
* a : 1000元
* b : 1000元
* * a -> 轉賬給b 100元
* b -> 轉賬給a 100元
* * 最後兩人仍舊剩餘1000元
* 要求:
* 必須是a先轉賬給b,然後b再轉賬給a
* 分別開啟兩個執行緒執行這兩個任務。
* * */
public
class t7
}//任務a
class ra implements runnable
@override
public
void
run()
//若a已經給了b一百元,則通知執行緒t2我已經給了b一百元了,可以往下進行了
if(b.getmoney()>1000) }}
}//任務b
class rb implements runnable
@override
public
void
run() catch (interruptedexception e) }}
synchronized (a)
}}//乙個銀行賬戶類
class rank
public string getid()
public
void
setid(string id)
public
float
getmoney()
public
void
setmoney(float money)
}
(5)當執行join()方法時,會讓當前呼叫此方法的執行緒進入執行狀態,若是沒有指定執行時間,則在當前執行緒執行完(進入死亡狀態後)其他執行緒才能夠繼續搶奪cpu執行權。
(6)同樣,既然有強制插入執行緒的方法,自然也有強制禮讓執行緒的方法。yield()方法,會使得執行此方法的當前執行緒進入就緒狀態,但值得注意的是,禮讓出來的cpu執行權只會被那些優先順序與當前執行緒相同,或者比當前執行緒更加高的執行緒搶奪到。
<4>執行
<5>死亡
1,如果在同步**塊中執行yield()方法會造成什麼結果?
2,如果乙個執行緒沒有wait()的話,notify會造成什麼結果?
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...
JAVA 多執行緒
為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...