分治演算法是五大常用演算法之一,本來不應該在這個時間寫這篇部落格,因為之前的執行緒池還沒有寫完,有些知識點也是需要用到的執行緒池的,但是架不住現在的專案裡有個坑隊友,名曰大桌球,他好像是批量註冊使用者還是什麼(暫時就先當做是批量註冊吧~),反正就是很多很多使用者,每個使用者大概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...