Skip to content

Commit 5fab96f

Browse files
committed
新增了部分资源释放问题的 bug,关闭线程池时都改为了立即关闭
1 parent f481f7c commit 5fab96f

10 files changed

+122
-86
lines changed

.travis.yml

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ language: java
22
sudo: false # faster builds
33

44
jdk:
5-
- oraclejdk8
65
- openjdk8
76

87
script: "mvn cobertura:cobertura"

README.md

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# stalker
22

3-
[![HitCount](http://hits.dwyl.io/blinkfox/stalker.svg)](http://hits.dwyl.io/blinkfox/stalker) [![Build Status](https://secure.travis-ci.org/blinkfox/stalker.svg)](https://travis-ci.org/blinkfox/stalker) [![GitHub license](https://img.shields.io/github/license/blinkfox/stalker.svg)](https://github.com/blinkfox/stalker/blob/master/LICENSE) [![codecov](https://codecov.io/gh/blinkfox/stalker/branch/master/graph/badge.svg)](https://codecov.io/gh/blinkfox/stalker) ![Java Version](https://img.shields.io/badge/Java-%3E%3D%208-blue.svg)
3+
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fblinkfox%2Fstalker&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com) [![Build Status](https://secure.travis-ci.org/blinkfox/stalker.svg)](https://travis-ci.org/blinkfox/stalker) [![GitHub license](https://img.shields.io/github/license/blinkfox/stalker.svg)](https://github.com/blinkfox/stalker/blob/master/LICENSE) [![codecov](https://codecov.io/gh/blinkfox/stalker/branch/master/graph/badge.svg)](https://codecov.io/gh/blinkfox/stalker) ![Java Version](https://img.shields.io/badge/Java-%3E%3D%208-blue.svg)
44

5-
> 这是一个简单的用来对 Java 代码做性能评估和性能测试的工具库
5+
> 这是一个简单、轻量级和可编程的 Java 代码性能测试工具库
66
77
## 一、特性
88

9-
- 简单、轻量级(jar包仅`52kb`
9+
- 简单、轻量级(jar 包仅`52kb`和可编程的性能测试工具库
1010
- 支持对性能的多种统计纬度
1111
- API 简单易用,易于集成或扩展
1212

@@ -18,14 +18,14 @@
1818
<dependency>
1919
<groupId>com.blinkfox</groupId>
2020
<artifactId>stalker</artifactId>
21-
<version>1.2.2</version>
21+
<version>1.2.3</version>
2222
</dependency>
2323
```
2424

2525
### 2. Gradle
2626

2727
```bash
28-
compile 'com.blinkfox:stalker:1.2.2'
28+
compile 'com.blinkfox:stalker:1.2.3'
2929
```
3030

3131
## 三、API 介绍和使用
@@ -362,6 +362,8 @@ Assert.assertFaster(Options.of(),
362362

363363
## 五、变更日志
364364

365+
- v1.2.3 修复 StalkerFuture 资源关闭不完全的 bug (2021-11-26)
366+
- 修复了 StalkerFuture 中 `done` 方法完成后资源关闭不完全的 `bug`
365367
- v1.2.2 新增了部分 API (2020-06-16)
366368
- 新增了和改进了部分 API;
367369
- v1.2.1 新增了部分 API (2020-06-15)

blinkfox-checks.xml

+87-54
Large diffs are not rendered by default.

pom.xml

+8-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.blinkfox</groupId>
88
<artifactId>stalker</artifactId>
9-
<version>1.2.3-SNAPSHOT</version>
9+
<version>1.2.3</version>
1010
<packaging>jar</packaging>
1111

1212
<name>stalker</name>
@@ -16,7 +16,7 @@
1616
<licenses>
1717
<license>
1818
<name>The Apache Software License, Version 2.0</name>
19-
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
19+
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
2020
</license>
2121
</licenses>
2222

@@ -49,26 +49,26 @@
4949
<dependency>
5050
<groupId>org.slf4j</groupId>
5151
<artifactId>slf4j-api</artifactId>
52-
<version>1.7.30</version>
52+
<version>1.7.32</version>
5353
</dependency>
5454
<dependency>
5555
<groupId>org.projectlombok</groupId>
5656
<artifactId>lombok</artifactId>
57-
<version>1.18.12</version>
57+
<version>1.18.22</version>
5858
<scope>provided</scope>
5959
</dependency>
6060

6161
<dependency>
6262
<groupId>org.slf4j</groupId>
6363
<artifactId>slf4j-simple</artifactId>
64-
<version>1.7.30</version>
64+
<version>1.7.32</version>
6565
<scope>test</scope>
6666
<optional>true</optional>
6767
</dependency>
6868
<dependency>
6969
<groupId>junit</groupId>
7070
<artifactId>junit</artifactId>
71-
<version>4.13.1</version>
71+
<version>4.13.2</version>
7272
<scope>test</scope>
7373
</dependency>
7474
</dependencies>
@@ -109,12 +109,12 @@
109109
<plugin>
110110
<groupId>org.apache.maven.plugins</groupId>
111111
<artifactId>maven-checkstyle-plugin</artifactId>
112-
<version>3.1.1</version>
112+
<version>3.1.2</version>
113113
<dependencies>
114114
<dependency>
115115
<groupId>com.puppycrawl.tools</groupId>
116116
<artifactId>checkstyle</artifactId>
117-
<version>8.30</version>
117+
<version>8.41.1</version>
118118
</dependency>
119119
</dependencies>
120120
<configuration>
@@ -134,7 +134,6 @@
134134
</execution>
135135
</executions>
136136
</plugin>
137-
138137
</plugins>
139138
</build>
140139

src/main/java/com/blinkfox/stalker/result/StalkerFuture.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ public class StalkerFuture implements RunnableFuture<List<Object>> {
2929
/**
3030
* 用于异步提交任务的线程池.
3131
*/
32-
private static final ExecutorService executor =
33-
StalkerExecutors.newThreadExecutor(4, 16, "stalker-future-thread");
32+
private final ExecutorService executor;
3433

3534
/**
3635
* 用于异步定时更新统计数据的线程池.
@@ -74,6 +73,7 @@ public StalkerFuture(Options options, Runnable runnable, MeasureRunner measureRu
7473
this.options = options;
7574
this.runnable = runnable;
7675
this.measureRunner = measureRunner;
76+
this.executor = StalkerExecutors.newSingleThreadExecutor("stalker-future-thread");
7777

7878
// 如果启用了定时更新统计数据的任务,就构造定时任务线程池,并开启异步定时获取统计数据的任务.
7979
ScheduledUpdater scheduledUpdater = options.getScheduledUpdater();
@@ -180,7 +180,7 @@ public StalkerFuture waitDone(Consumer<StalkerFuture> waitPeriodConsumer, long p
180180
public StalkerFuture done(Consumer<StalkerFuture> futureConsumer) {
181181
// 如果没完成,就阻塞休眠一定的时间,再判断是否完成了.
182182
while (!this.isDone()) {
183-
this.sleep(200L);
183+
this.sleep(50L);
184184
}
185185

186186
// 完成后执行对应的回调任务.
@@ -260,7 +260,7 @@ private void stopFutures() {
260260

261261
// 如果线程池未关闭,就关闭线程池,注意,这里不要理解关闭和立即终止正在运行中的任务,防止最后的统计数据更新异常.
262262
if (this.scheduledUpdateExecutor != null && !this.scheduledUpdateExecutor.isShutdown()) {
263-
this.scheduledUpdateExecutor.shutdown();
263+
this.scheduledUpdateExecutor.shutdownNow();
264264
}
265265
if (this.scheduledUpdateFuture != null && !this.scheduledUpdateFuture.isDone()) {
266266
this.scheduledUpdateFuture.cancel(false);

src/main/java/com/blinkfox/stalker/runner/ConcurrentMeasureRunner.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public MeasureResult run(Options options, Runnable runnable) {
5252
// 初始化存储的集合、线程池、并发工具类中的对象实例等.
5353
Semaphore semaphore = new Semaphore(concurrens);
5454
CountDownLatch countLatch = new CountDownLatch(threads);
55-
super.executorService = StalkerExecutors.newFixedThreadExecutor(threads, "concurrent-measure-thread");
55+
super.executorService = StalkerExecutors.newFixedThreadExecutor(threads, "stalker-concurrent-measure");
5656
super.startNanoTime = System.nanoTime();
5757

5858
// 在多线程下控制线程并发量,与循环搭配来一起执行和测量.
@@ -83,7 +83,7 @@ public MeasureResult run(Options options, Runnable runnable) {
8383
this.await(countLatch);
8484
super.setEndNanoTimeIfEmpty(System.nanoTime());
8585
super.completed.compareAndSet(false, true);
86-
StalkerExecutors.shutdown(this.executorService);
86+
StalkerExecutors.shutdownNow(this.executorService);
8787
return super.getMeasureResult();
8888
}
8989

src/main/java/com/blinkfox/stalker/runner/ConcurrentScheduledMeasureRunner.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ public class ConcurrentScheduledMeasureRunner extends ConcurrentMeasureRunner {
3838
*/
3939
public ConcurrentScheduledMeasureRunner() {
4040
super();
41-
this.scheduledExecutorService = StalkerExecutors.newScheduledThreadPool(1, "concurrent-scheduled-thread");
41+
this.scheduledExecutorService = StalkerExecutors.newScheduledThreadPool(1, "stalker-concurrent-scheduled");
4242
super.executorService = StalkerExecutors.newFixedThreadExecutor(
43-
StalkerExecutors.MAX_POOL_SIZE, "concurrent-measure-thread");
43+
StalkerExecutors.MAX_POOL_SIZE, "stalker-concurrent-scheduled-measure");
4444
}
4545

4646
/**
@@ -95,7 +95,7 @@ public MeasureResult run(Options options, Runnable runnable) {
9595
// 等待所有线程执行完毕,记录是否完成和完成时间,并关闭线程池等资源,最后将结果封装成实体信息返回.
9696
super.setEndNanoTimeIfEmpty(System.nanoTime());
9797
super.completed.compareAndSet(false, true);
98-
StalkerExecutors.shutdown(this.executorService, this.scheduledExecutorService);
98+
StalkerExecutors.shutdownNow(this.executorService, this.scheduledExecutorService);
9999
if (!this.scheduledFuture.isDone()) {
100100
this.scheduledFuture.cancel(true);
101101
}
@@ -110,7 +110,7 @@ public void stop() {
110110
super.stop();
111111

112112
// 关闭定时任务线程池和取消对应的定时任务.
113-
StalkerExecutors.shutdown(this.scheduledExecutorService);
113+
StalkerExecutors.shutdownNow(this.scheduledExecutorService);
114114
if (this.scheduledFuture != null && !this.scheduledFuture.isDone()) {
115115
this.scheduledFuture.cancel(true);
116116
}

src/main/java/com/blinkfox/stalker/runner/SimpleMeasureRunner.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class SimpleMeasureRunner extends AbstractMeasureRunner {
2828
*/
2929
public SimpleMeasureRunner() {
3030
super();
31+
super.executorService = StalkerExecutors.newSingleThreadExecutor("stalker-simple-measure");
3132
}
3233

3334
/**
@@ -41,12 +42,11 @@ public SimpleMeasureRunner() {
4142
public MeasureResult run(Options options, Runnable runnable) {
4243
boolean printErrorLog = options.isPrintErrorLog();
4344
int totalCount = options.getThreads() * options.getRuns();
44-
super.executorService = StalkerExecutors.newSingleThreadExecutor("simple-measure-thread");
4545
super.startNanoTime = System.nanoTime();
4646

4747
// 由于并发数是 1,直接单线程循环执行 (runs * threads) 次即可,
4848
// 将执行的相关任务以 Future 的形式来执行,便于程序动态取消任务或判断任务执行情况等.
49-
this.measureFuture = executorService.submit(() -> {
49+
this.measureFuture = super.executorService.submit(() -> {
5050
for (int i = 0; i < totalCount; ++i) {
5151
try {
5252
// 开始执行测量任务,记录开始时间、执行次数等.
@@ -75,7 +75,7 @@ public MeasureResult run(Options options, Runnable runnable) {
7575
// 等待所有线程执行完毕,并关闭线程池,最后将结果封装成实体信息.
7676
super.setEndNanoTimeIfEmpty(System.nanoTime());
7777
super.completed.compareAndSet(false, true);
78-
StalkerExecutors.shutdown(super.executorService);
78+
StalkerExecutors.shutdownNow(super.executorService);
7979
return super.getMeasureResult();
8080
}
8181

src/main/java/com/blinkfox/stalker/runner/SimpleScheduledMeasureRunner.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ public class SimpleScheduledMeasureRunner extends SimpleMeasureRunner {
3535
*/
3636
public SimpleScheduledMeasureRunner() {
3737
super();
38-
this.scheduledExecutorService = StalkerExecutors.newScheduledThreadPool(1, "simple-scheduled-thread");
39-
super.executorService = StalkerExecutors.newSingleThreadExecutor("simple-scheduled-measure-thread");
38+
this.scheduledExecutorService = StalkerExecutors.newScheduledThreadPool(1, "stalker-simple-scheduled");
39+
super.executorService = StalkerExecutors.newSingleThreadExecutor("stalker-simple-scheduled-measure");
4040
}
4141

4242
/**
@@ -97,7 +97,10 @@ public MeasureResult run(Options options, Runnable runnable) {
9797
// 如果没有设置相关的结束信息资源,就设置,没有关闭相关的资源就进行关闭.
9898
super.setEndNanoTimeIfEmpty(System.nanoTime());
9999
super.completed.compareAndSet(false, true);
100-
StalkerExecutors.shutdown(super.executorService, this.scheduledExecutorService);
100+
StalkerExecutors.shutdownNow(super.executorService, this.scheduledExecutorService);
101+
if (!this.scheduledFuture.isDone()) {
102+
this.scheduledFuture.cancel(true);
103+
}
101104
return super.getMeasureResult();
102105
}
103106

src/test/java/com/blinkfox/stalker/test/StalkerTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ public void submitWithStop() throws InterruptedException {
235235
@Test
236236
public void submitWithDuration() {
237237
// 构造新的输出结果.
238-
Options options = Options.ofDurationSeconds(5, 3).warmups(0)
238+
Options options = Options.ofDurationSeconds(15, 3).warmups(0)
239239
.outputs(MeasureOutput.ofList(new AsciiTableOutput()));
240240

241241
Stalker.submit(options, () -> new MyTestService().slowHello())

0 commit comments

Comments
 (0)