diff --git a/CHANGELOG.md b/CHANGELOG.md index d554fc1a7..a0d5b1243 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ # 5.4.2 (2020-08-29) ### 新特性 +* 【core 】 lock放在try外边(pr#1050@Github) + ### Bug修复# ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/DelegatedExecutorService.java b/hutool-core/src/main/java/cn/hutool/core/thread/DelegatedExecutorService.java index c60c8bab1..b7d47b05b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/DelegatedExecutorService.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/DelegatedExecutorService.java @@ -1,5 +1,7 @@ package cn.hutool.core.thread; +import cn.hutool.core.lang.Assert; + import java.util.Collection; import java.util.List; import java.util.concurrent.AbstractExecutorService; @@ -16,86 +18,83 @@ import java.util.concurrent.TimeoutException; * @author loolly */ public class DelegatedExecutorService extends AbstractExecutorService { - private final ExecutorService e; + private final ExecutorService e; - DelegatedExecutorService(ExecutorService executor) { - e = executor; - } + /** + * 构造 + * + * @param executor {@link ExecutorService} + */ + DelegatedExecutorService(ExecutorService executor) { + Assert.notNull(executor, "executor must be not null !"); + e = executor; + } - @Override - @SuppressWarnings("NullableProblems") - public void execute(Runnable command) { - e.execute(command); - } + @Override + public void execute(Runnable command) { + e.execute(command); + } - @Override - public void shutdown() { - e.shutdown(); - } + @Override + public void shutdown() { + e.shutdown(); + } - @Override - @SuppressWarnings("NullableProblems") - public List shutdownNow() { - return e.shutdownNow(); - } + @Override + public List shutdownNow() { + return e.shutdownNow(); + } - @Override - public boolean isShutdown() { - return e.isShutdown(); - } + @Override + public boolean isShutdown() { + return e.isShutdown(); + } - @Override - public boolean isTerminated() { - return e.isTerminated(); - } + @Override + public boolean isTerminated() { + return e.isTerminated(); + } - @Override - @SuppressWarnings("NullableProblems") - public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { - return e.awaitTermination(timeout, unit); - } + @Override + public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { + return e.awaitTermination(timeout, unit); + } - @Override - @SuppressWarnings("NullableProblems") - public Future submit(Runnable task) { - return e.submit(task); - } + @Override + public Future submit(Runnable task) { + return e.submit(task); + } - @Override - @SuppressWarnings("NullableProblems") - public Future submit(Callable task) { - return e.submit(task); - } + @Override + public Future submit(Callable task) { + return e.submit(task); + } - @Override - @SuppressWarnings("NullableProblems") - public Future submit(Runnable task, T result) { - return e.submit(task, result); - } + @Override + public Future submit(Runnable task, T result) { + return e.submit(task, result); + } - @Override - @SuppressWarnings("NullableProblems") - public List> invokeAll(Collection> tasks) throws InterruptedException { - return e.invokeAll(tasks); - } + @Override + public List> invokeAll(Collection> tasks) throws InterruptedException { + return e.invokeAll(tasks); + } - @Override - @SuppressWarnings("NullableProblems") - public List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) - throws InterruptedException { - return e.invokeAll(tasks, timeout, unit); - } + @Override + public List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) + throws InterruptedException { + return e.invokeAll(tasks, timeout, unit); + } - @Override - @SuppressWarnings("NullableProblems") - public T invokeAny(Collection> tasks) - throws InterruptedException, ExecutionException { - return e.invokeAny(tasks); - } + @Override + public T invokeAny(Collection> tasks) + throws InterruptedException, ExecutionException { + return e.invokeAny(tasks); + } - @Override - public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) - throws InterruptedException, ExecutionException, TimeoutException { - return e.invokeAny(tasks, timeout, unit); - } + @Override + public T invokeAny(Collection> tasks, long timeout, TimeUnit unit) + throws InterruptedException, ExecutionException, TimeoutException { + return e.invokeAny(tasks, timeout, unit); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java b/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java index 29749783d..d51d6e52b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java @@ -8,6 +8,12 @@ import java.util.concurrent.ExecutorService; * @author loolly */ public class FinalizableDelegatedExecutorService extends DelegatedExecutorService { + + /** + * 构造 + * + * @param executor {@link ExecutorService} + */ FinalizableDelegatedExecutorService(ExecutorService executor) { super(executor); } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java index 9e75abedb..27daf2948 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java @@ -20,255 +20,255 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; * @author Looly */ public class TaskTable implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private final Scheduler scheduler; - private final TimeZone timezone; + private final Scheduler scheduler; + private final TimeZone timezone; - private final List ids = new ArrayList<>(); - private final List patterns = new ArrayList<>(); - private final List tasks = new ArrayList<>(); - private int size; + private final List ids = new ArrayList<>(); + private final List patterns = new ArrayList<>(); + private final List tasks = new ArrayList<>(); + private int size; - /** - * 构造 - * - * @param scheduler {@link Scheduler} - */ - public TaskTable(Scheduler scheduler) { - this.scheduler = scheduler; - this.timezone = scheduler.getTimeZone(); - } + /** + * 构造 + * + * @param scheduler {@link Scheduler} + */ + public TaskTable(Scheduler scheduler) { + this.scheduler = scheduler; + this.timezone = scheduler.getTimeZone(); + } - /** - * 新增Task - * - * @param id ID - * @param pattern {@link CronPattern} - * @param task {@link Task} - * @return this - */ - public TaskTable add(String id, CronPattern pattern, Task task) { - final Lock writeLock = lock.writeLock(); - writeLock.lock(); - try { - if (ids.contains(id)) { - throw new CronException("Id [{}] has been existed!", id); - } - ids.add(id); - patterns.add(pattern); - tasks.add(task); - size++; - } finally { - writeLock.unlock(); - } - return this; - } + /** + * 新增Task + * + * @param id ID + * @param pattern {@link CronPattern} + * @param task {@link Task} + * @return this + */ + public TaskTable add(String id, CronPattern pattern, Task task) { + final Lock writeLock = lock.writeLock(); + writeLock.lock(); + try { + if (ids.contains(id)) { + throw new CronException("Id [{}] has been existed!", id); + } + ids.add(id); + patterns.add(pattern); + tasks.add(task); + size++; + } finally { + writeLock.unlock(); + } + return this; + } - /** - * 获取所有ID,返回不可变列表,即列表不可修改 - * - * @return ID列表 - * @since 4.6.7 - */ - public List getIds() { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - return Collections.unmodifiableList(this.ids); - } finally { - readLock.unlock(); - } - } + /** + * 获取所有ID,返回不可变列表,即列表不可修改 + * + * @return ID列表 + * @since 4.6.7 + */ + public List getIds() { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + return Collections.unmodifiableList(this.ids); + } finally { + readLock.unlock(); + } + } - /** - * 获取所有定时任务表达式,返回不可变列表,即列表不可修改 - * - * @return 定时任务表达式列表 - * @since 4.6.7 - */ - public List getPatterns() { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - return Collections.unmodifiableList(this.patterns); - } finally { - readLock.unlock(); - } - } + /** + * 获取所有定时任务表达式,返回不可变列表,即列表不可修改 + * + * @return 定时任务表达式列表 + * @since 4.6.7 + */ + public List getPatterns() { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + return Collections.unmodifiableList(this.patterns); + } finally { + readLock.unlock(); + } + } - /** - * 获取所有定时任务,返回不可变列表,即列表不可修改 - * - * @return 定时任务列表 - * @since 4.6.7 - */ - public List getTasks() { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - return Collections.unmodifiableList(this.tasks); - } finally { - readLock.unlock(); - } - } + /** + * 获取所有定时任务,返回不可变列表,即列表不可修改 + * + * @return 定时任务列表 + * @since 4.6.7 + */ + public List getTasks() { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + return Collections.unmodifiableList(this.tasks); + } finally { + readLock.unlock(); + } + } - /** - * 移除Task - * - * @param id Task的ID - */ - public void remove(String id) { - final Lock writeLock = lock.writeLock(); - writeLock.lock(); - try { - final int index = ids.indexOf(id); - if (index > -1) { - tasks.remove(index); - patterns.remove(index); - ids.remove(index); - size--; - } - } finally { - writeLock.unlock(); - } - } + /** + * 移除Task + * + * @param id Task的ID + */ + public void remove(String id) { + final Lock writeLock = lock.writeLock(); + writeLock.lock(); + try { + final int index = ids.indexOf(id); + if (index > -1) { + tasks.remove(index); + patterns.remove(index); + ids.remove(index); + size--; + } + } finally { + writeLock.unlock(); + } + } - /** - * 更新某个Task的定时规则 - * - * @param id Task的ID - * @param pattern 新的表达式 - * @return 是否更新成功,如果id对应的规则不存在则不更新 - * @since 4.0.10 - */ - public boolean updatePattern(String id, CronPattern pattern) { - final Lock writeLock = lock.writeLock(); - writeLock.lock(); - try { - final int index = ids.indexOf(id); - if (index > -1) { - patterns.set(index, pattern); - return true; - } - } finally { - writeLock.unlock(); - } - return false; - } + /** + * 更新某个Task的定时规则 + * + * @param id Task的ID + * @param pattern 新的表达式 + * @return 是否更新成功,如果id对应的规则不存在则不更新 + * @since 4.0.10 + */ + public boolean updatePattern(String id, CronPattern pattern) { + final Lock writeLock = lock.writeLock(); + writeLock.lock(); + try { + final int index = ids.indexOf(id); + if (index > -1) { + patterns.set(index, pattern); + return true; + } + } finally { + writeLock.unlock(); + } + return false; + } - /** - * 获得指定位置的{@link Task} - * - * @param index 位置 - * @return {@link Task} - * @since 3.1.1 - */ - public Task getTask(int index) { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - return tasks.get(index); - } finally { - readLock.unlock(); - } - } + /** + * 获得指定位置的{@link Task} + * + * @param index 位置 + * @return {@link Task} + * @since 3.1.1 + */ + public Task getTask(int index) { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + return tasks.get(index); + } finally { + readLock.unlock(); + } + } - /** - * 获得指定id的{@link Task} - * - * @param id ID - * @return {@link Task} - * @since 3.1.1 - */ - public Task getTask(String id) { - final int index = ids.indexOf(id); - if (index > -1) { - return getTask(index); - } - return null; - } + /** + * 获得指定id的{@link Task} + * + * @param id ID + * @return {@link Task} + * @since 3.1.1 + */ + public Task getTask(String id) { + final int index = ids.indexOf(id); + if (index > -1) { + return getTask(index); + } + return null; + } - /** - * 获得指定位置的{@link CronPattern} - * - * @param index 位置 - * @return {@link CronPattern} - * @since 3.1.1 - */ - public CronPattern getPattern(int index) { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - return patterns.get(index); - } finally { - readLock.unlock(); - } - } + /** + * 获得指定位置的{@link CronPattern} + * + * @param index 位置 + * @return {@link CronPattern} + * @since 3.1.1 + */ + public CronPattern getPattern(int index) { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + return patterns.get(index); + } finally { + readLock.unlock(); + } + } - /** - * 任务表大小,加入的任务数 - * - * @return 任务表大小,加入的任务数 - * @since 4.0.2 - */ - public int size() { - return this.size; - } + /** + * 任务表大小,加入的任务数 + * + * @return 任务表大小,加入的任务数 + * @since 4.0.2 + */ + public int size() { + return this.size; + } - /** - * 任务表是否为空 - * - * @return true为空 - * @since 4.0.2 - */ - public boolean isEmpty() { - return this.size < 1; - } + /** + * 任务表是否为空 + * + * @return true为空 + * @since 4.0.2 + */ + public boolean isEmpty() { + return this.size < 1; + } - /** - * 获得指定id的{@link CronPattern} - * - * @param id ID - * @return {@link CronPattern} - * @since 3.1.1 - */ - public CronPattern getPattern(String id) { - final int index = ids.indexOf(id); - if (index > -1) { - return getPattern(index); - } - return null; - } + /** + * 获得指定id的{@link CronPattern} + * + * @param id ID + * @return {@link CronPattern} + * @since 3.1.1 + */ + public CronPattern getPattern(String id) { + final int index = ids.indexOf(id); + if (index > -1) { + return getPattern(index); + } + return null; + } - /** - * 如果时间匹配则执行相应的Task,带读锁 - * - * @param millis 时间毫秒 - */ - public void executeTaskIfMatch(long millis) { - final Lock readLock = lock.readLock(); - readLock.lock(); - try { - executeTaskIfMatchInternal(millis); - } finally { - readLock.unlock(); - } - } + /** + * 如果时间匹配则执行相应的Task,带读锁 + * + * @param millis 时间毫秒 + */ + public void executeTaskIfMatch(long millis) { + final Lock readLock = lock.readLock(); + readLock.lock(); + try { + executeTaskIfMatchInternal(millis); + } finally { + readLock.unlock(); + } + } - /** - * 如果时间匹配则执行相应的Task,无锁 - * - * @param millis 时间毫秒 - * @since 3.1.1 - */ - protected void executeTaskIfMatchInternal(long millis) { - for (int i = 0; i < size; i++) { - if (patterns.get(i).match(timezone, millis, this.scheduler.matchSecond)) { - this.scheduler.taskExecutorManager.spawnExecutor(tasks.get(i)); - } - } - } + /** + * 如果时间匹配则执行相应的Task,无锁 + * + * @param millis 时间毫秒 + * @since 3.1.1 + */ + protected void executeTaskIfMatchInternal(long millis) { + for (int i = 0; i < size; i++) { + if (patterns.get(i).match(timezone, millis, this.scheduler.matchSecond)) { + this.scheduler.taskExecutorManager.spawnExecutor(tasks.get(i)); + } + } + } }