经过了一番思考,我觉得可以这样想:对于一个循环的连续数字段,我们可以在给定线程数时,就将这一段数字平均分配给每个线程,因此每个线程只需要按步处理它的任务就行。因为没有跟其他线程的数据发生耦合,所以就可以保证每个数字都只被处理一次,同时在文件写入时也不会出现问题。
接下来,我按照这个思路写了一段测试代码,完整代码如下:
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 < 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 <= </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<=</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,如需转载请自行联系原作者