以下是一段線程小程式代碼,模擬了一個兩個賣票口出票的小程式: class yuan implements Runnable{ public static int piao=1; public void run() { while(piao<=20){ synchronized(""){ System ...
以下是一段線程小程式代碼,模擬了一個兩個賣票口出票的小程式:
class yuan implements Runnable{
public static int piao=1;
public void run() {
while(piao<=20){
synchronized(""){
System.out.println(Thread.currentThread().getName()+"當前賣第"+piao+"張票");
piao++;
}
}
}
}
public class ceshi6 {
public void asd(){
Thread a=new Thread(new yuan());
Thread b=new Thread(new yuan());
b.setPriority(10);
a.setName("a口");
b.setName("b口");
a.start();
b.start();
}
public static void main(String[] args) {
ceshi6 q=new ceshi6();
q.asd();
}
}
執行結果如下:
a口當前賣第1張票
a口當前賣第2張票
b口當前賣第3張票
b口當前賣第4張票
b口當前賣第5張票
b口當前賣第6張票
b口當前賣第7張票
b口當前賣第8張票
b口當前賣第9張票
b口當前賣第10張票
b口當前賣第11張票
b口當前賣第12張票
b口當前賣第13張票
b口當前賣第14張票
b口當前賣第15張票
b口當前賣第16張票
b口當前賣第17張票
a口當前賣第18張票
a口當前賣第19張票
a口當前賣第20張票
b口當前賣第21張票
問題:很奇怪為什麼明明迴圈20到頭卻執行了21?
原因:因為線程在運行while中不一定什麼時候切換
可能是兩個線程同時運行run 因為在synchronize前受阻 所以有一種情況就是兩個線程都已經進入了while等待 但是同一時間只能有一個線程進入synchronize 所以假設a進入則b仍在等待 當a中的
piao+1之後 現在piao為21 而在synchronize門口等著的b並不會結束而是進入synchronize 用21輸出 然後兩個線程都 不滿足while大條件 線程結束。
將代碼修改為如下(只改run方法別的都不動)
public void run() {
while(true){
synchronized("aa"){
if(piao<=20){
System.out.println(Thread.currentThread().getName()+"當前賣第"+piao+"張票");
piao++;
}
else break;
}
}
}
總結:
1、多個線程同時搶一個cpu
2、setPriority:設置優先順序 只是說被設置優先順序的線程被分到的幾率大一點並不是一定分到。預設優先順序是5。
3、synchronize作用:加鎖 在一個線程將synchronize中代碼執行完成前其他的線程會被阻塞
4、重點給piao加上static 如果是一個類的對象分不同線程不加static也可以
5、new出來的每次new的都不一樣,列{
Thread a=new Thread(new yuan());
Thread b=new Thread(new yuan());
這兩個a和b線程 所對應的實現介面類對象是不同的
}
當日其他總結:
1、final所聲明對象只能被構造一次,若語句下還有構造則系統提示語法錯誤。