簡單的多執行緒

2021-09-25 23:25:42 字數 3720 閱讀 1900

多個執行緒之間是搶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...