diff --git a/app.db b/app.db
index e9185c0..fce7551 100644
Binary files a/app.db and b/app.db differ
diff --git a/pom.xml b/pom.xml
index 260d851..a46f33b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,7 @@
com.iflytop
uf
- 0.0.12
+ 0.0.19
diff --git a/src/main/java/com/iflytop/a800/ResourceLockManager.java b/src/main/java/com/iflytop/a800/ResourceLockManager.java
new file mode 100644
index 0000000..85ce74d
--- /dev/null
+++ b/src/main/java/com/iflytop/a800/ResourceLockManager.java
@@ -0,0 +1,53 @@
+package com.iflytop.a800;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+public class ResourceLockManager {
+ // lock map
+ private final Map> locks = new HashMap<>();
+ // singleton
+ private static final ResourceLockManager instance = new ResourceLockManager();
+
+ // get instance
+ public static ResourceLockManager getInstance() {
+ return instance;
+ }
+
+ // lock
+ public Object lock( String resName ) {
+ Object lock = new Object();
+ synchronized ( this.locks ) {
+ var locks = this.locks.computeIfAbsent(resName, k -> new ArrayList<>());
+ if ( locks.isEmpty() ) {
+ locks.add(lock);
+ return lock;
+ }
+ locks.add(lock);
+ }
+ synchronized ( lock ) {
+ try {
+ lock.wait();
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return lock;
+ }
+
+ // unlock
+ public void unlock( String resName, Object lock ) {
+ Object nextLock = null;
+ synchronized ( this.locks ) {
+ var locks = this.locks.get(resName);
+ if ( null == locks ) {
+ return ;
+ }
+ locks.remove(lock);
+ nextLock = locks.isEmpty() ? null : locks.get(0);
+ }
+ synchronized ( nextLock ) {
+ nextLock.notify();
+ }
+ }
+}
diff --git a/src/main/java/com/iflytop/a800/Task.java b/src/main/java/com/iflytop/a800/Task.java
new file mode 100644
index 0000000..ed56ef3
--- /dev/null
+++ b/src/main/java/com/iflytop/a800/Task.java
@@ -0,0 +1,5 @@
+package com.iflytop.a800;
+public interface Task {
+ // start this task
+ void start();
+}
diff --git a/src/main/java/com/iflytop/a800/TaskBase.java b/src/main/java/com/iflytop/a800/TaskBase.java
new file mode 100644
index 0000000..0be7bd0
--- /dev/null
+++ b/src/main/java/com/iflytop/a800/TaskBase.java
@@ -0,0 +1,36 @@
+package com.iflytop.a800;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+abstract public class TaskBase extends Thread implements Task {
+ // 事件回调
+ public interface EventCallback {
+ void callback( Task task, List