天天看点

Java中有返回值的线程,(缓存)线程池的初步使用

一 简介

在JDK1.5以前的线程是没有返回值的(Thread,Runnable),Callable这个接口是之后才出现的新特性,用法跟Runnable类似,只是不同的是可以有返回值。因此为了测试Callable这个类以及线程池相关内容,我将上一篇文章中的代码进行了小幅度的修改然后写了一下

二 关于线程池的简单使用步骤

1 定义线程类,(1)extends Thread (2)implements Runnable (3)implements Callable<> 

2 建立ExecutorService线程池,比如这样写:ExecutorService pool = Executors.newCachedThreadPool(); 这是建立一个缓存池。一般常用的还有:(1)newFixedThreadPool() (2)ScheduledThreadPool() (3)SingleThreadExecutor()

3 调用线程池进行操作

//执行任务并获取Future对象 

Future<List<String>> future = pool.submit(myThread);

//从Future对象上获取任务的返回值

future.get();

三 完整测试代码

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

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

<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>import</code> <code>java.util.ArrayList;</code>

<code>import</code> <code>java.util.Iterator;</code>

<code>import</code> <code>java.util.List;</code>

<code>import</code> <code>java.util.concurrent.Callable;</code>

<code>import</code> <code>java.util.concurrent.ExecutionException;</code>

<code>import</code> <code>java.util.concurrent.ExecutorService;</code>

<code>import</code> <code>java.util.concurrent.Executors;</code>

<code>import</code> <code>java.util.concurrent.Future;</code>

<code>public</code> <code>class</code> <code>Test2 {</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>String fileName = </code><code>"C:\\Users\\Administrator\\Desktop\\测试2.txt"</code><code>;</code>

<code>        </code><code>int</code> <code>threadNum = </code><code>5</code><code>;  </code><code>//测试用的线程数目</code>

<code>        </code><code>List&lt;String&gt; list = </code><code>new</code> <code>ArrayList&lt;String&gt;();</code>

<code>        </code> 

<code>        </code><code>//创建一个缓存线程池</code>

<code>        </code><code>ExecutorService pool = Executors.newCachedThreadPool();</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>Callable&lt;List&lt;String&gt;&gt; myThread = </code><code>new</code> <code>MyThread2(</code><code>"线程"</code> <code>+ i, i, threadNum);</code>

<code>            </code><code>Future&lt;List&lt;String&gt;&gt; future = pool.submit(myThread);</code>

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

<code>                </code><code>list.addAll(future.get());</code>

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

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

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

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

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

<code>        </code><code>pool.shutdown();  </code><code>//不关闭的话,要等到超时程序才会结束</code>

<code>        </code><code>Iterator&lt;String&gt; iterator = list.iterator();</code>

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

<code>            </code><code>BufferedWriter writer = </code><code>new</code> <code>BufferedWriter(</code><code>new</code> <code>FileWriter(</code><code>new</code> <code>File(fileName)));</code>

<code>            </code><code>while</code><code>(iterator.hasNext()){</code>

<code>                </code><code>writer.write(iterator.next());</code>

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

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

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

<code>            </code> 

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

<code>            </code><code>// TODO Auto-generated catch block</code>

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

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

<code>        </code><code>System.out.println(millis2 - millis1);  </code><code>//大约170-177ms</code>

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

<code>}</code>

<code>/**</code>

<code> </code><code>* 自定义任务(线程)</code>

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

<code>class</code> <code>MyThread2 </code><code>implements</code> <code>Callable&lt;List&lt;String&gt;&gt;{</code>

<code>    </code><code>private</code> <code>String name; </code><code>// 线程的名字</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>public</code> <code>MyThread2(String name, </code><code>int</code> <code>i, </code><code>int</code> <code>threadNum) {</code>

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

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

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

<code>    </code><code>public</code> <code>List&lt;String&gt; call() </code><code>throws</code> <code>Exception {</code>

<code>        </code><code>MyPrint2 myPrint2 = </code><code>new</code> <code>MyPrint2();</code>

<code>        </code><code>return</code> <code>myPrint2.print(name, i, threadNum);</code>

<code>    </code> 

<code> </code><code>* 具体的业务操作</code>

<code>class</code> <code>MyPrint2 {</code>

<code>    </code><code>public</code> <code>List&lt;String&gt; print(String name, </code><code>int</code> <code>x, </code><code>int</code> <code>threadNum) {</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>//          System.out.println(name + ": " + i + "----------------------------------我是一条华丽的小尾巴");</code>

<code>            </code><code>list.add(name + </code><code>": "</code> <code>+ i + </code><code>"----------------------------------我是一条华丽的小尾巴"</code><code>);</code>

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

<code>        </code><code>return</code> <code>list;</code>

注:这种写法由于步骤较多,因此在这里反而比单线程还稍慢O(∩_∩)O~

本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1722426,如需转载请自行联系原作者