天天看點

多線程循環批量處理以及多線程操作檔案寫入相關思路

經過了一番思考,我覺得可以這樣想:對于一個循環的連續數字段,我們可以在給定線程數時,就将這一段數字平均配置設定給每個線程,是以每個線程隻需要按步處理它的任務就行。因為沒有跟其他線程的資料發生耦合,是以就可以保證每個數字都隻被處理一次,同時在檔案寫入時也不會出現問題。

接下來,我按照這個思路寫了一段測試代碼,完整代碼如下:

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

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

<code>package</code> <code>thread;</code>

<code>import</code> <code>java.io.BufferedWriter;</code>

<code>import</code> <code>java.io.File;</code>

<code>import</code> <code>java.io.FileWriter;</code>

<code>import</code> <code>java.io.IOException;</code>

<code>public</code> <code>class</code> <code>Test1 {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>

<code>        </code><code>long</code> <code>millis1 = System.currentTimeMillis();</code>

<code>        </code><code>int</code> <code>threadNum = </code><code>5</code><code>; </code><code>// 測試用的線程數目</code>

<code>        </code><code>String fileName = </code><code>"C:\\Users\\Administrator\\Desktop\\測試1.txt"</code><code>; </code><code>// 檔案名</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i &lt; threadNum; i++) {</code>

<code>            </code><code>MyThread myThread = </code><code>new</code> <code>MyThread(i, threadNum, fileName);</code>

<code>            </code><code>Thread tempThread = </code><code>new</code> <code>Thread(myThread);</code>

<code>            </code><code>tempThread.setName(</code><code>"線程"</code> <code>+ i);</code>

<code>            </code><code>tempThread.start();</code>

<code>        </code><code>}</code>

<code>        </code><code>long</code> <code>millis2 = System.currentTimeMillis();</code>

<code>        </code><code>System.out.println(millis2 - millis1);  </code><code>//大約1-2ms</code>

<code>    </code><code>}</code>

<code>}</code>

<code>/**</code>

<code> </code><code>* 自定義線程</code>

<code> </code><code>* */</code>

<code>class</code> <code>MyThread </code><code>implements</code> <code>Runnable {</code>

<code>    </code><code>private</code> <code>int</code> <code>i; </code><code>// 第幾個線程</code>

<code>    </code><code>private</code> <code>int</code> <code>threadNum; </code><code>// 總共建立了幾個線程</code>

<code>    </code><code>private</code> <code>String fileName;  </code><code>//檔案名</code>

<code>    </code><code>public</code> <code>MyThread(</code><code>int</code> <code>i, </code><code>int</code> <code>threadNum, String fileName) {</code>

<code>        </code><code>this</code><code>.i = i;</code>

<code>        </code><code>this</code><code>.threadNum = threadNum;</code>

<code>        </code><code>this</code><code>.fileName = fileName;</code>

<code>    </code><code>public</code> <code>void</code> <code>run() {</code>

<code>        </code><code>new</code> <code>MyPrint().print(i, threadNum, fileName);</code>

<code> </code><code>* 具體的業務操作</code>

<code>class</code> <code>MyPrint {</code>

<code>    </code><code>private</code> <code>BufferedWriter writer;</code>

<code>    </code><code>public</code> <code>void</code> <code>print(</code><code>int</code> <code>x, </code><code>int</code> <code>threadNum, String fileName) {</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>writer = </code><code>new</code> <code>BufferedWriter(</code>

<code>                    </code><code>new</code> <code>FileWriter(</code><code>new</code> <code>File(fileName), </code><code>true</code><code>));  </code><code>//如果檔案已存在則在後面追加</code>

<code>            </code><code>for</code> <code>(</code><code>int</code> <code>i = x; i &lt;= </code><code>10000</code><code>; i = i + threadNum) {</code>

<code>                </code><code>String temp = Thread.currentThread().getName() + </code><code>": "</code> <code>+ i</code>

<code>                        </code><code>+ </code><code>"----------------------------------我是一條華麗的小尾巴"</code><code>;</code>

<code>//              System.out.println(temp);</code>

<code>                </code><code>writer.write(temp);</code>

<code>                </code><code>writer.newLine();</code>

<code>                </code><code>writer.flush();</code>

<code>            </code><code>}</code>

<code>            </code><code>writer.close();</code>

<code>        </code><code>} </code><code>catch</code> <code>(IOException e) {</code>

<code>            </code><code>e.printStackTrace();</code>

經過測試發現,雖然隻用了5個線程,但是執行效率也是非常高的,1~2ms就可以全部處理完了。

附:

對于同樣的寫入資訊,單線程的代碼是這樣的:

<code>public</code> <code>class</code> <code>Test {</code>

<code>        </code><code>String fileName = </code><code>"C:\\Users\\Administrator\\Desktop\\測試0.txt"</code><code>; </code><code>// 檔案名</code>

<code>            </code><code>BufferedWriter writer = </code><code>new</code> <code>BufferedWriter(</code>

<code>                    </code><code>new</code> <code>FileWriter(</code><code>new</code> <code>File(fileName), </code><code>true</code><code>));</code>

<code>            </code> 

<code>            </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i&lt;=</code><code>100000</code><code>;i++){</code>

<code>                </code><code>String temp = </code><code>"單線程: "</code> <code>+ i</code>

<code>        </code><code>} </code><code>catch</code> <code>(IOException e) {      </code>

<code>        </code><code>} </code>

<code>        </code> 

<code>        </code><code>System.out.println(millis2 - millis1);  </code><code>//大約162-168ms</code>

經過測試,全部執行完大概需要花費160多毫秒,這個效率跟上面的多線程比起來是遠遠不如的O(∩_∩)O~

本文轉自 pangfc 51CTO部落格,原文連結:http://blog.51cto.com/983836259/1722422,如需轉載請自行聯系原作者