1 public class CalcTest{
2
3 private volatile int beforeValue = 0;//最后一个启动线程需要计算范围的的起始值
4 private volatile boolean isStop = false;//是否完成了所有的输出
5 private volatile boolean isChangeBeforeValue = true;//是否有线程启动成功,并改变了beforeValue
6 private volatile int threadCount = 0;//所有线程总数
7 private volatile Integer nowThreadCount = 0;//当前计算线程总数
8 private final int minValue = 0;//范围最小值
9 private final int maxValue = 100000000;//范围最大值
10 private final int speed = 10000;//每一个线程需要计算数字的个数,改值设置的越小,每一个子线程进行计算所需时间就会相应减少,当前处于计算的总子线程数也就相应减小
11 private LinkedBlockingQueue<String> result = new LinkedBlockingQueue<>();//计算结果存放队列
12
13 @Test
14 public void test_calc() {
15 Timestamp startTime = new Timestamp(System.currentTimeMillis());//开始时间
16 final ExecutorService calcThreadPool = Executors.newFixedThreadPool(1);//进行拆分计算的固定缓存池
17 calcThreadPool.execute(new Runnable() {
18 @Override
19 public void run() {
20 calc();
21 calcThreadPool.shutdown();
22 }
23 });
24 //从结果队列中时时取出结果
25 String nextResult;
26 while (!isStop || !result.isEmpty()) {
27 nextResult = result.poll();
28 if (nextResult == null) {
29 continue;
30 }
31 System.out.println("now calc thread total count:" + nowThreadCount + " , now beforeValue:" + beforeValue + " ," + nextResult);
32 }
33 //计算完了统计一下
34 System.out.println("------------------- ok ---------------------");
35 System.out.println(result);
36 Timestamp endTime = new Timestamp(System.currentTimeMillis());
37 System.out.println(startTime + "-->" + endTime);
38 System.out.println("共开起线程总数:" + threadCount);
39 System.out.println((endTime.getTime() - startTime.getTime()) / 1000 + "秒");
40 }
41
42 public void calc() {
43 beforeValue = minValue;
44 while (true) {
45 if (isChangeBeforeValue) {
46 threadCount++;
47 isChangeBeforeValue = false;
48 try {
49 synchronized (nowThreadCount) {
50 nowThreadCount++;
51 }
52 final ExecutorService calcThreadPool = Executors.newCachedThreadPool();
53 calcThreadPool.execute(new Runnable() {
54 @Override
55 public void run() {
56 int firstValue = beforeValue + 1;
57 int lastValue = firstValue + speed;
58 final int endValue = (lastValue > maxValue ? maxValue : lastValue);
59 isStop = endValue == maxValue;
60 beforeValue = endValue;
61 isChangeBeforeValue = true;
62 StringBuilder sb = new StringBuilder();
63 for (int i = firstValue; i <= endValue; i++) {
64 String str = " " + i + "平方:" + Math.pow(i, 2);
65 sb.append(str);
66 }
67 try {
68 result.put(" calc thread " + Thread.currentThread().getId() + " => " + sb.toString());
69 sb.setLength(0);
70 } catch (InterruptedException e) {
71 e.printStackTrace();
72 }
73 synchronized (nowThreadCount) {
74 nowThreadCount--;
75 }
76 calcThreadPool.shutdown();
77 }
78 });
79 } catch (Exception e) {
80 System.out.println(e.getMessage());
81 break;
82 }
83 }
84 if (isStop && !result.isEmpty()) {
85 break;
86 }
87 }
88 }
89 }
90