Java併發程式設計 分治程式設計

2021-08-14 04:58:08 字數 2787 閱讀 5916

分治演算法是五大常用演算法之一,本來不應該在這個時間寫這篇部落格,因為之前的執行緒池還沒有寫完,有些知識點也是需要用到的執行緒池的,但是架不住現在的專案裡有個坑隊友,名曰大桌球,他好像是批量註冊使用者還是什麼(暫時就先當做是批量註冊吧~),反正就是很多很多使用者,每個使用者大概0.5秒左右的註冊時間,要睡覺時我問他,你的電腦怎麼還開著啊,他說在那註冊使用者呢,得跑一宿···幾千條還是幾萬條,就乙個主線程for迴圈在那跑著······所以先寫個部落格,也算是給他寫的,看看用分治演算法怎麼來解決這個問題。

fork/join框架直白點說,就是把乙個大任務分解成若干個小任務,小任務可以繼續無限的分解成小小任務、小小小任務,每個子執行緒處理這些分解後的任務,然後將處理完成後的結果合併,最後合併成乙個完整的處理結果,然後返回結果。

二、fork/join框架簡介

首先我們需要乙個處理任務的執行緒池:

forkjoinpool pool = new forkjoinpool();

1 執行緒池可以執行乙個簡單的任務:

pool.submit(callable);

pool.submit(runnable);

pool.submit(forkjointask);

pool.execute(runnable);

pool.execute(forkjointask);

我們現在只看 pool.submit(forkjointask)和pool.execute(forkjointask),他們都接收乙個forkjointask任務,我們來看下forkjointask:

這裡寫描述

我們可以看到,forkjointask是繼承object類的,下面還有好好多多子類,我們接著看他的子類:recursivetask和recursiveaction,這也是今天我們要用到的兩個任務類。

public class testtask extends recursiveaction

@override

protected void compute() else

}}}

1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

17 18

19 20

21 22

23 24

25 26

27 28

29 30

31 32

33 這裡可能需要講解一下,然後就直接寫在注釋裡面了。這裡值得注意一下的就是fork()方法,這是核心方法。執行**:

public static void main(string args)
1

2 3

4 5

看下log:

public class maxtask extends recursivetask

@override

protected integer compute() catch (interruptedexception e) catch (executionexception e)

} else

return -1;

}} 1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

17 18

19 20

21 22

23 24

25 26

27 28

29 30

31 32

33 34

35 36

37 38

39 40

這裡有兩行**:system.arraycopy(),這個方法的作用是拷貝陣列,不會用的童鞋去網上搜尋下,篇幅有限就不在這講解了。get()方法會在下一段**後的文字中說明。

呼叫**:

public static void main(string args) ;

maxtask task = new maxtask(ints);

forkjoinpool pool = new forkjoinpool();

forkjointasksubmit = pool.submit(task);

try catch (interruptedexception e) catch (executionexception e)

}

1

2 3

4 5

6 7

8 9

10 11

12 13

14 接下來看log:

注意下這行**:integer integer = submit.get(); get方法具有阻塞效果,也就是說,如果任務沒有發完成的時候,會在get()這裡阻塞住,直到任務完成,才會釋放阻塞並返回結果,若已經完成任務,那麼get()方法直接回返回結果。

public class accountbean

@override

public string tostring() ';

}} 1 2

3 4

5 6

7 8

9 10

11 12

13 14

15 16

17 18

然後建立乙個task:

public class signuptask extends recursivetask

JAVA併發程式設計

通過常量字串 string 來呼叫 wait 或 notify 方法所導致的問題是,jvm 編譯器會在內部自動將內容相同的 string 轉變為相同的物件。這意味著,即便你建立了兩個不同的 mywaitnotify 例項,他們內部的 mymonitorobject 變數也會指向相同的 string ...

Java併發程式設計

執行緒之間通訊 1.加鎖 object.wait 釋放鎖 object.notify 與sychronized 聯合使用,object lock new object sychronized lock sychronized lock 2.改進 無需加鎖並發包下 countdownlatch.awa...

Java併發程式設計教程

1 使用執行緒的經驗 設定名稱 響應中斷 使用threadlocal 2 executor executorservice和future 3 阻塞佇列 put和take offer和poll drainto 4 執行緒間的協調手段 lock condition wait notify notifya...