mirror of
https://gitee.com/dromara/hutool.git
synced 2025-07-15 05:13:18 +08:00
add stop
This commit is contained in:
parent
415b2a285f
commit
2c1d10d952
@ -3,11 +3,12 @@
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# 5.6.6 (2021-05-11)
|
# 5.6.6 (2021-05-14)
|
||||||
|
|
||||||
### 🐣新特性
|
### 🐣新特性
|
||||||
* 【cron 】 增加时间轮简单实现
|
* 【cron 】 增加时间轮简单实现
|
||||||
* 【core 】 BeanUtil.copyToList增加重载(pr#321@Gitee)
|
* 【core 】 BeanUtil.copyToList增加重载(pr#321@Gitee)
|
||||||
|
* 【core 】 SyncFinisher增加stop方法(issue#1578@Github)
|
||||||
|
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ import java.util.concurrent.ExecutorService;
|
|||||||
/**
|
/**
|
||||||
* 线程同步结束器<br>
|
* 线程同步结束器<br>
|
||||||
* 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
|
* 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* ps:
|
* ps:
|
||||||
* //模拟1000个线程并发
|
* //模拟1000个线程并发
|
||||||
@ -21,8 +21,8 @@ import java.util.concurrent.ExecutorService;
|
|||||||
* });
|
* });
|
||||||
* sf.start()
|
* sf.start()
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @author Looly
|
* @author Looly
|
||||||
* @since 4.1.15
|
* @since 4.1.15
|
||||||
*/
|
*/
|
||||||
@ -30,7 +30,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
private final Set<Worker> workers;
|
private final Set<Worker> workers;
|
||||||
private final int threadSize;
|
private final int threadSize;
|
||||||
private final ExecutorService executorService;
|
private ExecutorService executorService;
|
||||||
|
|
||||||
private boolean isBeginAtSameTime;
|
private boolean isBeginAtSameTime;
|
||||||
/** 启动同步器,用于保证所有worker线程同时开始 */
|
/** 启动同步器,用于保证所有worker线程同时开始 */
|
||||||
@ -40,19 +40,18 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造
|
* 构造
|
||||||
*
|
*
|
||||||
* @param threadSize 线程数
|
* @param threadSize 线程数
|
||||||
*/
|
*/
|
||||||
public SyncFinisher(int threadSize) {
|
public SyncFinisher(int threadSize) {
|
||||||
this.beginLatch = new CountDownLatch(1);
|
this.beginLatch = new CountDownLatch(1);
|
||||||
this.threadSize = threadSize;
|
this.threadSize = threadSize;
|
||||||
this.executorService = ThreadUtil.newExecutor(threadSize);
|
|
||||||
this.workers = new LinkedHashSet<>();
|
this.workers = new LinkedHashSet<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置是否所有worker线程同时开始
|
* 设置是否所有worker线程同时开始
|
||||||
*
|
*
|
||||||
* @param isBeginAtSameTime 是否所有worker线程同时开始
|
* @param isBeginAtSameTime 是否所有worker线程同时开始
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
@ -63,7 +62,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加定义的线程数同等数量的worker
|
* 增加定义的线程数同等数量的worker
|
||||||
*
|
*
|
||||||
* @param runnable 工作线程
|
* @param runnable 工作线程
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
@ -81,7 +80,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加工作线程
|
* 增加工作线程
|
||||||
*
|
*
|
||||||
* @param runnable 工作线程
|
* @param runnable 工作线程
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
@ -96,7 +95,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 增加工作线程
|
* 增加工作线程
|
||||||
*
|
*
|
||||||
* @param worker 工作线程
|
* @param worker 工作线程
|
||||||
* @return this
|
* @return this
|
||||||
*/
|
*/
|
||||||
@ -106,20 +105,26 @@ public class SyncFinisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始工作
|
* 开始工作<br>
|
||||||
|
* 执行此方法后如果不再重复使用此对象,需调用{@link #stop()}关闭回收资源。
|
||||||
*/
|
*/
|
||||||
public void start() {
|
public void start() {
|
||||||
start(true);
|
start(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开始工作
|
* 开始工作<br>
|
||||||
*
|
* 执行此方法后如果不再重复使用此对象,需调用{@link #stop()}关闭回收资源。
|
||||||
|
*
|
||||||
* @param sync 是否阻塞等待
|
* @param sync 是否阻塞等待
|
||||||
* @since 4.5.8
|
* @since 4.5.8
|
||||||
*/
|
*/
|
||||||
public void start(boolean sync) {
|
public void start(boolean sync) {
|
||||||
endLatch = new CountDownLatch(workers.size());
|
endLatch = new CountDownLatch(workers.size());
|
||||||
|
|
||||||
|
if(null == this.executorService || this.executorService.isShutdown()){
|
||||||
|
this.executorService = ThreadUtil.newExecutor(threadSize);
|
||||||
|
}
|
||||||
for (Worker worker : workers) {
|
for (Worker worker : workers) {
|
||||||
executorService.submit(worker);
|
executorService.submit(worker);
|
||||||
}
|
}
|
||||||
@ -135,9 +140,27 @@ public class SyncFinisher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 结束线程池。此方法执行两种情况:
|
||||||
|
* <ol>
|
||||||
|
* <li>执行start(true)后,调用此方法结束线程池回收资源</li>
|
||||||
|
* <li>执行start(false)后,用户自行判断结束点执行此方法</li>
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* @since 5.6.6
|
||||||
|
*/
|
||||||
|
public void stop(){
|
||||||
|
if(null != this.executorService){
|
||||||
|
this.executorService.shutdown();
|
||||||
|
}
|
||||||
|
this.executorService = null;
|
||||||
|
|
||||||
|
clearWorker();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 等待所有Worker工作结束,否则阻塞
|
* 等待所有Worker工作结束,否则阻塞
|
||||||
*
|
*
|
||||||
* @throws InterruptedException 用户中断
|
* @throws InterruptedException 用户中断
|
||||||
* @deprecated 使用start方法指定是否阻塞等待
|
* @deprecated 使用start方法指定是否阻塞等待
|
||||||
*/
|
*/
|
||||||
@ -159,7 +182,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 剩余任务数
|
* 剩余任务数
|
||||||
*
|
*
|
||||||
* @return 剩余任务数
|
* @return 剩余任务数
|
||||||
*/
|
*/
|
||||||
public long count() {
|
public long count() {
|
||||||
@ -168,7 +191,7 @@ public class SyncFinisher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 工作者,为一个线程
|
* 工作者,为一个线程
|
||||||
*
|
*
|
||||||
* @author xiaoleilu
|
* @author xiaoleilu
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@ -11,25 +11,25 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class RandomUtilTest {
|
public class RandomUtilTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void randomEleSetTest(){
|
public void randomEleSetTest(){
|
||||||
Set<Integer> set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
|
Set<Integer> set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
|
||||||
Assert.assertEquals(set.size(), 2);
|
Assert.assertEquals(set.size(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void randomElesTest(){
|
public void randomElesTest(){
|
||||||
List<Integer> result = RandomUtil.randomEles(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
|
List<Integer> result = RandomUtil.randomEles(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);
|
||||||
Assert.assertEquals(result.size(), 2);
|
Assert.assertEquals(result.size(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void randomDoubleTest() {
|
public void randomDoubleTest() {
|
||||||
double randomDouble = RandomUtil.randomDouble(0, 1, 0, RoundingMode.HALF_UP);
|
double randomDouble = RandomUtil.randomDouble(0, 1, 0, RoundingMode.HALF_UP);
|
||||||
Assert.assertTrue(randomDouble <= 1);
|
Assert.assertTrue(randomDouble <= 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Ignore
|
@Ignore
|
||||||
public void randomBooleanTest() {
|
public void randomBooleanTest() {
|
||||||
|
Loading…
Reference in New Issue
Block a user