多個執行緒之間是搶cpu的關係有隨機性
主線程的名字:main 子執行緒的名字:從thread-0開始命名
setname可以命名
start()方法,來開啟執行緒,繼而實現run方法的自動呼叫.
手動呼叫run的時候,他失去了任務區的功能,變成了乙個普通的方法.
執行緒和任務分離 ,哪個執行緒需要工作,就將任務交給誰
thread內部預設有乙個run,又通過實現介面類傳入乙個run,優先呼叫傳入的run。
thread t = new thread(new runnable(實現介面的物件));
1.關鍵字
synchronized關鍵字(隱式同步)
1、synchronized關鍵字的作用域有二種:
1)是某個物件例項內,synchronized amethod(){}可以防止多個執行緒同時訪問這個物件
的synchronized方法(如果乙個物件有多個synchronized方法,只要乙個執行緒訪問了其中的
乙個synchronized方法,其它執行緒不能同時訪問這個物件中任何乙個synchronized方法)。
這時,不同的物件例項的synchronized方法是不相干擾的。也就是說,其它執行緒照樣可以同時
訪問相同類的另乙個物件例項中的synchronized方法;
2)是某個類的範圍,synchronizedstaticastaticmethod{}防止多個執行緒同時訪問
這個類中的synchronized static 方法。它可以對類的所有物件例項起作用。
2、除了方法前用synchronized關鍵字,synchronized關鍵字還可以用於方法中的某個區塊中,
表示只對這個區塊的資源實行互斥訪問。用法是: synchronized(this),它的作用域是當前物件;
3、synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){}
在繼承類中並不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定
它的某個方法為synchronized方法;
2.特點
但是每次使用都要判斷,所以降低了效率
使用時有兩個及其以上執行緒共享乙個資料
synchronized
(鎖(物件)
)
解釋:在某一段任務中,同一時間只允許乙個執行緒執行任務,其他的執行緒即使搶到了cpu,也無法進入當前的任務區間,只有當當前的執行緒將任務執行完後,其他的執行緒才能有資格進入
1.要求
1.必須是物件 2.必須保證被多個執行緒共享
注意: 靜態同步函式的鎖是其所屬類的位元組碼檔案物件
2.例子
1.乙個普通的物件 2.當前物件的引用–this 3.類的位元組碼檔案
注意:位元組碼檔案的使用範圍太大,一般不建議使用.
public
class
demo4
}//任務類
class
ticket1
implements
runnable
else}}
}}
1.函式:
notify()/notifyall()/wait():
wait():
讓當前的執行緒變成等待的狀態,放入乙個池子(執行緒容器),失去了搶cpu的能力,.等待喚醒(鎖相當於給當前的執行緒做了乙個標記)
notify():
讓當前的執行緒從等待狀態喚醒,相當於從池子中取出執行緒.(喚醒的是同一把鎖下的任意乙個執行緒)
notifyall():
喚醒的是同一把鎖下的所有執行緒
注意:1.鎖就是標記
2.必須要跟synchronize一起用的,否則會異常
2.優化分離
public
class
demo8
}//建立資料類
class
des2
catch
(interruptedexception e)
//當執行這行**的時候,這裡對應的是哪個執行緒,就操作的是哪個執行緒
}this
.name = name;
this
.*** = ***;
flag =
!flag;
notify()
;//喚醒的是通一把鎖下的執行緒,因為現在只有乙個輸入執行緒,乙個輸出執行緒.所以這裡喚醒的是輸出執行緒
//當執行緒池中沒有被當前的鎖標記的執行緒可喚醒時,我們成為空喚醒,空喚醒不影響程式的執行.
}//負責輸出
public
void
getdata()
catch
(interruptedexception e)
} system.out.
println
("姓名:"
+name+
" 性別:"
+***);
flag =
! flag;
notify()
;//喚醒的是輸入執行緒}}
//兩個任務區:輸入任務,輸出任務
class
input2
implements
runnable
public
void
run(
)else
i=(i+1)%
2;}}
}}class
output2
implements
runnable
public
void
run()}
}}
public class demo14 catch (interruptedexception e)
int i =0;
while (true)
} }}class mytest implements runnable
}}
public
class
demo14
catch
(interruptedexception e)
int i =0;
while
(true)}
}}class
mytest
implements
runnable
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+" 明天吃西瓜");
}}}
當程式呼叫setdaemon方法時,並且將引數設定成true.當前執行緒就變成了守護線層.
注意:這個方法一定要在start方法之前呼叫
join()方法:
原理:執行緒一旦呼叫了join方法,他的優先順序會高於主線程.主線程會等當前的執行緒執行完後再去執行.
注意點:優先順序只比main執行緒的高.對其他的執行緒沒有影響.
簡單的多執行緒程式
下面是一段在windows環境下,建立多個執行緒執行程式的一段 這段 我去年就見過了,雖然挺簡單的,但是一直沒有在意,這次重新看它,希望能夠看出點不一樣的東西,平行計算一直是我乙個非常喜歡的研究方向.在自己寫的過程當中,還有乙個地方出現了乙個小小的錯誤,我想這如果不是我自己重新又寫了一遍是不會發現這...
多執行緒的簡單應用
前一陣兒用python寫了乙個抓取某 的指令碼,打包成了帶有gui的可執行程式,介面沒有怎麼設計只是有兩個按鈕,分別抓取兩類,並將抓取的放到當前目錄的上一資料夾。gui是用python自帶的庫tkinter,下面是效果圖 只有當抓取完成後圖形介面才會回到正常狀態。從網上查了一下,發現這是因為將邏輯處...
簡單的多執行緒查詢
下面是顯用來顯示方法執行的時間,但是暫時沒有顯示出方法名稱,之前在做多資料來源的時候,在用到aop根據註解來切換資料來源的方法中,有根據joinpoint引數來得到乙個方法名稱,之後可以考慮新增一下。public class methodtimer public static void end el...