Skip to content

Commit 2860efb

Browse files
authored
Merge pull request #25 from patricklaux/dev
1.0.20
2 parents ba25c0d + c433e26 commit 2860efb

File tree

5 files changed

+162
-24
lines changed

5 files changed

+162
-24
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不
2020
<dependency>
2121
<groupId>com.igeeksky.xtool</groupId>
2222
<artifactId>xtool</artifactId>
23-
<version>1.0.19</version>
23+
<version>1.0.20</version>
2424
</dependency>
2525
```
2626

2727
### 2.2.Gradle
2828

2929
```groovy
30-
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.19'
30+
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.20'
3131
```
3232

3333
### 2.3.编译安装

docs/Reference.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## xtool-1.0.10参考文档
22

3-
Author: [Patrick.Lau](mailto:[email protected]) Version: 1.0.19
3+
Author: [Patrick.Lau](mailto:[email protected]) Version: 1.0.20
44

55
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) [![Release](https://img.shields.io/github/v/release/patricklaux/xtool)](https://github.com/patricklaux/xtool/releases) [![Maven Central](https://img.shields.io/maven-central/v/com.igeeksky.xtool/xtool.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22com.igeeksky.xtool%22%20AND%20a:%22xtool%22) [![codecov](https://codecov.io/gh/patricklaux/xtool/branch/main/graph/badge.svg?token=VJ87A1IAVH)](https://codecov.io/gh/patricklaux/xtool) [![Last commit](https://img.shields.io/github/last-commit/patricklaux/xtool)](https://github.com/patricklaux/xtool/commits) [![Join the chat at https://gitter.im/igeeksky/xtool](https://badges.gitter.im/igeeksky/xtool.svg)](https://gitter.im/igeeksky/xtool?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
66

@@ -26,14 +26,14 @@ xtool 是一个小小的 Java 工具集,遵循简单、可靠的原则,不
2626
<dependency>
2727
<groupId>com.igeeksky.xtool</groupId>
2828
<artifactId>xtool</artifactId>
29-
<version>1.0.19</version>
29+
<version>1.0.20</version>
3030
</dependency>
3131
```
3232

3333
#### 1.2.2.Gradle
3434

3535
```groovy
36-
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.19'
36+
implementation group: 'com.igeeksky.xtool', name: 'xtool', version: '1.0.20'
3737
```
3838

3939
#### 1.2.3.编译安装

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.igeeksky.xtool</groupId>
88
<artifactId>xtool</artifactId>
9-
<version>1.0.19</version>
9+
<version>1.0.20</version>
1010
<name>xtool</name>
1111
<description>xtool is a very small set of Java tools.</description>
1212
<url>https://github.com/patricklaux/xtool</url>

src/main/java/com/igeeksky/xtool/core/concurrent/Futures.java

Lines changed: 155 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.igeeksky.xtool.core.concurrent;
22

3+
import java.util.ArrayList;
34
import java.util.concurrent.ExecutionException;
45
import java.util.concurrent.Future;
56
import java.util.concurrent.TimeUnit;
@@ -11,29 +12,115 @@
1112
*/
1213
public class Futures {
1314

15+
/**
16+
* 等待所有任务完成(无时间限制)
17+
*
18+
* @param futures 任务列表
19+
*/
20+
public static void awaitAll(Future<?>[] futures) {
21+
int i = 0, len = futures.length;
22+
try {
23+
for (; i < len; i++) {
24+
Future<?> future = futures[i];
25+
if (future != null) {
26+
if (future.isDone()) {
27+
continue;
28+
}
29+
future.get();
30+
}
31+
}
32+
} catch (InterruptedException | ExecutionException e) {
33+
throw new ConcurrentException(e);
34+
}
35+
}
36+
37+
/**
38+
* 等待所有任务完成(无时间限制)
39+
*
40+
* @param futures 任务列表
41+
*/
42+
public static void awaitAll(ArrayList<Future<?>> futures) {
43+
int i = 0, len = futures.size();
44+
try {
45+
for (; i < len; i++) {
46+
Future<?> future = futures.get(i);
47+
if (future != null) {
48+
if (future.isDone()) {
49+
continue;
50+
}
51+
future.get();
52+
}
53+
}
54+
} catch (InterruptedException | ExecutionException e) {
55+
throw new ConcurrentException(e);
56+
}
57+
}
58+
59+
/**
60+
* 等待所有任务完成(有时间限制)
61+
*
62+
* @param timeout 超时时间
63+
* @param unit 时间单位
64+
* @param start 起始位置,从此位置开始检查任务是否已完成,如未完成,则等待给定的时间
65+
* @param futures 任务列表
66+
* @return 剩余未完成任务的起始位置
67+
*/
1468
public static int awaitAll(long timeout, TimeUnit unit, int start, Future<?>[] futures) {
1569
int i = start, len = futures.length;
1670
try {
1771
long nanos = unit.toNanos(timeout);
18-
long time = System.nanoTime();
72+
long endTime = System.nanoTime() + nanos;
1973

2074
for (; i < len; i++) {
2175
if (nanos < 0) {
2276
return i;
2377
}
2478

2579
Future<?> future = futures[i];
26-
2780
if (future != null) {
2881
if (future.isDone()) {
2982
continue;
3083
}
31-
3284
future.get(nanos, TimeUnit.NANOSECONDS);
85+
nanos = endTime - System.nanoTime();
86+
}
87+
}
3388

34-
long now = System.nanoTime();
35-
nanos -= now - time;
36-
time = now;
89+
return i;
90+
} catch (TimeoutException e) {
91+
return i;
92+
} catch (Exception e) {
93+
throw new ConcurrentException(e);
94+
}
95+
}
96+
97+
/**
98+
* 等待所有任务完成(有时间限制)
99+
*
100+
* @param timeout 超时时间
101+
* @param unit 时间单位
102+
* @param start 起始位置,从此位置开始检查任务是否已完成,如未完成,则等待给定的时间
103+
* @param futures 任务列表
104+
* @return 剩余未完成的任务的起始位置
105+
*/
106+
public static int awaitAll(long timeout, TimeUnit unit, int start, ArrayList<Future<?>> futures) {
107+
int i = start, len = futures.size();
108+
try {
109+
long nanos = unit.toNanos(timeout);
110+
long endTime = System.nanoTime() + nanos;
111+
112+
for (; i < len; i++) {
113+
if (nanos < 0) {
114+
return i;
115+
}
116+
117+
Future<?> future = futures.get(i);
118+
if (future != null) {
119+
if (future.isDone()) {
120+
continue;
121+
}
122+
future.get(nanos, TimeUnit.NANOSECONDS);
123+
nanos = endTime - System.nanoTime();
37124
}
38125
}
39126

@@ -45,6 +132,54 @@ public static int awaitAll(long timeout, TimeUnit unit, int start, Future<?>[] f
45132
}
46133
}
47134

135+
/**
136+
* 检查是否还有未完成的任务
137+
*
138+
* @param start 起始位置,从此位置开始检查任务是否已完成
139+
* @param futures 任务列表
140+
* @return 剩余未完成的任务的起始位置
141+
*/
142+
public static int checkAll(int start, ArrayList<Future<?>> futures) {
143+
int i = start, len = futures.size();
144+
for (; i < len; i++) {
145+
Future<?> future = futures.get(i);
146+
if (future != null) {
147+
if (future.isDone()) {
148+
continue;
149+
}
150+
return i;
151+
}
152+
}
153+
return i;
154+
}
155+
156+
/**
157+
* 检查是否还有未完成的任务
158+
*
159+
* @param start 起始位置,从此位置开始检查任务是否已完成
160+
* @param futures 任务列表
161+
* @return 剩余未完成的任务的起始位置
162+
*/
163+
public static int checkAll(int start, Future<?>[] futures) {
164+
int i = start, len = futures.length;
165+
for (; i < len; i++) {
166+
Future<?> future = futures[i];
167+
if (future != null) {
168+
if (future.isDone()) {
169+
continue;
170+
}
171+
return i;
172+
}
173+
}
174+
return i;
175+
}
176+
177+
/**
178+
* 取消所有未完成的任务
179+
*
180+
* @param start 起始位置,从此位置开始取消未完成的任务
181+
* @param futures 任务列表
182+
*/
48183
public static void cancelAll(int start, Future<?>[] futures) {
49184
int i = start, len = futures.length;
50185
for (; i < len; i++) {
@@ -58,20 +193,22 @@ public static void cancelAll(int start, Future<?>[] futures) {
58193
}
59194
}
60195

61-
public static void awaitAll(Future<?>[] futures) {
62-
int i = 0, len = futures.length;
63-
try {
64-
for (; i < len; i++) {
65-
Future<?> future = futures[i];
66-
if (future != null) {
67-
if (future.isDone()) {
68-
continue;
69-
}
70-
future.get();
196+
/**
197+
* 取消所有未完成的任务
198+
*
199+
* @param start 起始位置,从此位置开始取消未完成的任务
200+
* @param futures 任务列表
201+
*/
202+
public static void cancelAll(int start, ArrayList<Future<?>> futures) {
203+
int i = start, len = futures.size();
204+
for (; i < len; i++) {
205+
Future<?> future = futures.get(i);
206+
if (future != null) {
207+
if (future.isDone()) {
208+
continue;
71209
}
210+
future.cancel(true);
72211
}
73-
} catch (InterruptedException | ExecutionException e) {
74-
throw new ConcurrentException(e);
75212
}
76213
}
77214

src/main/java/com/igeeksky/xtool/core/io/IOUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,5 @@ public static long copy(InputStream source, OutputStream target) {
100100
throw new IOException(e);
101101
}
102102
}
103+
103104
}

0 commit comments

Comments
 (0)