Looly 5 年之前
父节点
当前提交
6d21bb930e

+ 2 - 0
CHANGELOG.md

@@ -6,6 +6,8 @@
 # 5.4.2 (2020-08-29)
 
 ### 新特性
+* 【core  】     lock放在try外边(pr#1050@Github)
+
 ### Bug修复#
 
 -------------------------------------------------------------------------------------------------------------

+ 81 - 82
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;
-
-    DelegatedExecutorService(ExecutorService executor) {
-        e = executor;
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public void execute(Runnable command) {
-        e.execute(command);
-    }
-
-    @Override
-    public void shutdown() {
-        e.shutdown();
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public List<Runnable> shutdownNow() {
-        return e.shutdownNow();
-    }
-
-    @Override
-    public boolean isShutdown() {
-        return e.isShutdown();
-    }
-
-    @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
-    @SuppressWarnings("NullableProblems")
-    public Future<?> submit(Runnable task) {
-        return e.submit(task);
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public <T> Future<T> submit(Callable<T> task) {
-        return e.submit(task);
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public <T> Future<T> submit(Runnable task, T result) {
-        return e.submit(task, result);
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
-        return e.invokeAll(tasks);
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
-            throws InterruptedException {
-        return e.invokeAll(tasks, timeout, unit);
-    }
-
-    @Override
-    @SuppressWarnings("NullableProblems")
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
-            throws InterruptedException, ExecutionException {
-        return e.invokeAny(tasks);
-    }
-
-    @Override
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
-            throws InterruptedException, ExecutionException, TimeoutException {
-        return e.invokeAny(tasks, timeout, unit);
-    }
+	private final ExecutorService e;
+
+	/**
+	 * 构造
+	 *
+	 * @param executor {@link ExecutorService}
+	 */
+	DelegatedExecutorService(ExecutorService executor) {
+		Assert.notNull(executor, "executor must be not null !");
+		e = executor;
+	}
+
+	@Override
+	public void execute(Runnable command) {
+		e.execute(command);
+	}
+
+	@Override
+	public void shutdown() {
+		e.shutdown();
+	}
+
+	@Override
+	public List<Runnable> shutdownNow() {
+		return e.shutdownNow();
+	}
+
+	@Override
+	public boolean isShutdown() {
+		return e.isShutdown();
+	}
+
+	@Override
+	public boolean isTerminated() {
+		return e.isTerminated();
+	}
+
+	@Override
+	public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+		return e.awaitTermination(timeout, unit);
+	}
+
+	@Override
+	public Future<?> submit(Runnable task) {
+		return e.submit(task);
+	}
+
+	@Override
+	public <T> Future<T> submit(Callable<T> task) {
+		return e.submit(task);
+	}
+
+	@Override
+	public <T> Future<T> submit(Runnable task, T result) {
+		return e.submit(task, result);
+	}
+
+	@Override
+	public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
+		return e.invokeAll(tasks);
+	}
+
+	@Override
+	public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+			throws InterruptedException {
+		return e.invokeAll(tasks, timeout, unit);
+	}
+
+	@Override
+	public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
+			throws InterruptedException, ExecutionException {
+		return e.invokeAny(tasks);
+	}
+
+	@Override
+	public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
+			throws InterruptedException, ExecutionException, TimeoutException {
+		return e.invokeAny(tasks, timeout, unit);
+	}
 }

+ 6 - 0
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);
 	}

+ 233 - 233
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<String> ids = new ArrayList<>();
-    private final List<CronPattern> patterns = new ArrayList<>();
-    private final List<Task> tasks = new ArrayList<>();
-    private int size;
+	private final List<String> ids = new ArrayList<>();
+	private final List<CronPattern> patterns = new ArrayList<>();
+	private final List<Task> 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<String> 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<String> getIds() {
+		final Lock readLock = lock.readLock();
+		readLock.lock();
+		try {
+			return Collections.unmodifiableList(this.ids);
+		} finally {
+			readLock.unlock();
+		}
+	}
 
-    /**
-     * 获取所有定时任务表达式,返回不可变列表,即列表不可修改
-     *
-     * @return 定时任务表达式列表
-     * @since 4.6.7
-     */
-    public List<CronPattern> getPatterns() {
-        final Lock readLock = lock.readLock();
-        readLock.lock();
-        try {
-            return Collections.unmodifiableList(this.patterns);
-        } finally {
-            readLock.unlock();
-        }
-    }
+	/**
+	 * 获取所有定时任务表达式,返回不可变列表,即列表不可修改
+	 *
+	 * @return 定时任务表达式列表
+	 * @since 4.6.7
+	 */
+	public List<CronPattern> getPatterns() {
+		final Lock readLock = lock.readLock();
+		readLock.lock();
+		try {
+			return Collections.unmodifiableList(this.patterns);
+		} finally {
+			readLock.unlock();
+		}
+	}
 
-    /**
-     * 获取所有定时任务,返回不可变列表,即列表不可修改
-     *
-     * @return 定时任务列表
-     * @since 4.6.7
-     */
-    public List<Task> getTasks() {
-        final Lock readLock = lock.readLock();
-        readLock.lock();
-        try {
-            return Collections.unmodifiableList(this.tasks);
-        } finally {
-            readLock.unlock();
-        }
-    }
+	/**
+	 * 获取所有定时任务,返回不可变列表,即列表不可修改
+	 *
+	 * @return 定时任务列表
+	 * @since 4.6.7
+	 */
+	public List<Task> 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));
+			}
+		}
+	}
 }