博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动任务调度系统
阅读量:7185 次
发布时间:2019-06-29

本文共 35087 字,大约阅读时间需要 116 分钟。

  这个自动任务调度系统的来由是这样的:前段时间,在一个 Java 技术群中,看到一个网友发了一个消息,说:自己在面试中,遇到编写一个具体的自动任务调度系统。并把面试中的那个任务调度系统的需求发到了群中。当时,感觉没有头绪,就没怎么想了。后来感觉吧,还挺有意思的,于是就分析了一下,大致完成了需求中的要求。可能内容比较长,我把提纲先列了出来:

  (1)面试中,具体的项目要求

那位朋友,在面试中,遇到的自动任务调度系统的需求是这样的:

设计一个自动任务调度系统需求:

1. 有三种类型的任务,分别为查询任务、提交任务、同步任务。每种类型任务都有自己的处理方式。       
    一个任务生成线程,每秒钟生成个5任务,每个任务类型是随机选择的三种任务之一。
    1)  查询任务职责:打印“查询任务”+执行到第几条。
    2)  提交任务职责:打印“提交任务”+执行到第几条,并暂停5秒钟。
    3)  同步任务职责:在执行时,每执行三个任务,成功2个,失败一个(抛RuntimeException).
        失败的任务必须在规定的时间后被重新执行,只在第三次执行这个任务时成功。
        成功执行的任务,打印“同步任务”+执行到第几条。
        
2. 任务需要并发执行
3. 任务执行成功,设置任务状态为成功,记录成功时间。
4. 如果任务执行失败,需要根据每种任务类型配置的重试间隔时间重新执行,并记录失败原因。
5. 允许使用的线程数最少5个,最多不超过10个线程。
6. 执行成功的任务不能再次执行。

  (2)自己根据需求做的分析

根据上面的需求,我画了用例图和类图

(2.1)用例图如下:

我将其大致分为两个部分:生成线程和执行线程,复杂的就是执行线程。

(2.2)类图如下:

我从需求中的信息中,抽离出了任务类(Task)、任务类型枚举(TaskTypeEnum)、线程池(ThreadPool)和操作线程类(GenerateThread),在操作线程类中,存在生成线程的方法和执行线程的方法,在执行过程中,任务的执行状态都保存在任务类(Task)的属性中。

  (3)分析后,具体的编程实现

具体的类如下:

(3.1)TaskTypeEnum 枚举

1 /** 2  * 0.0.0.1 3  */ 4 package com.auto.system; 5  6 import java.util.Random; 7  8 /** 9  * 任务类型的枚举10  * @author 高青11  * 2014-5-2012  */13 public enum TaskTypeEnum {14     SELECT("查询任务"), COMMIT("提交任务"), TOGETHER("同步任务");15     16     /** 中文名称 */17     private String CN_NAME; 18     19     private TaskTypeEnum(){20     }21     22     /**23      * 随机得到任务类型24      * @author 高青25      * 2014-6-1026      * @return TaskTypeEnum 任务类型枚举类对象27      */28     public static TaskTypeEnum getRandomTaskTypeEnum(){29         //使用随机数判断30         Random random = new Random();31         32         switch (random.nextInt(3)) {33         case 0:34             return TaskTypeEnum.SELECT;35         case 1:36             return TaskTypeEnum.COMMIT;37         default:38             return TaskTypeEnum.TOGETHER;39         }40     }41     42     private TaskTypeEnum(String cn_name){43         this.CN_NAME = cn_name;44     }45     46     public String toString(){47         return CN_NAME;48     }49 }
View Code

(3.2)Task 类

1 /**  2  * 0.0.0.1  3  */  4 package com.auto.system;  5   6   7 /**  8  * 任务类  9  * @author 高青 10  * 2014-5-20 11  */ 12 public class Task { 13      14     /** 任务的类型 */ 15     private TaskTypeEnum type; 16      17     /** 任务执行的状态 (-1:未执行;0:正在执行;1:执行完毕) */ 18     private int executeStatus; 19      20     /** 任务执行成功 */ 21     private boolean isSuccess; 22      23     /** 执行成功的时间 */ 24     private String executeTime; 25      26     /** 执行失败的原因 */ 27     private String failedReasons; 28  29     /** 30      * 默认构造方法 31      * 2014-5-20 32      */ 33     public Task() { 34          35     } 36  37     /** 38      * @param type 任务的类型 39      * @param executeStatus 任务执行的状态  40      * @param isSuccess 任务执行成功 41      * @param executeTime 执行成功的时间 42      * @param failedReasons 执行失败的原因 43      * 2014-5-20 44      */ 45     public Task(TaskTypeEnum type, int executeStatus, boolean isSuccess, 46             String executeTime, String failedReasons) { 47         super(); 48         this.type = type; 49         this.executeStatus = executeStatus; 50         this.isSuccess = isSuccess; 51         this.executeTime = executeTime; 52         this.failedReasons = failedReasons; 53     } 54      55     /** 56      * 执行任务 57      * @author 高青 58      * 2014-05-30 59      * @param taskTypeEnum 任务的类型 60      * @param index 当前执行任务的索引值 61      * @return void 空 62      */ 63     public void executeTask(TaskTypeEnum taskTypeEnum, int index){ 64         switch (taskTypeEnum) { 65          66         //查询任务 67         case SELECT: 68             System.out.println(""); 69             break; 70  71         default: 72             break; 73         } 74     } 75  76     /** 77      * @return the type 78      */ 79     public TaskTypeEnum getType() { 80         return type; 81     } 82  83     /** 84      * @param type the type to set 85      */ 86     public void setType(TaskTypeEnum type) { 87         this.type = type; 88     } 89  90     /** 91      * @return the executeStatus 92      */ 93     public int getExecuteStatus() { 94         return executeStatus; 95     } 96  97     /** 98      * @param executeStatus the executeStatus to set 99      */100     public void setExecuteStatus(int executeStatus) {101         this.executeStatus = executeStatus;102     }103 104     /**105      * @return the isSuccess106      */107     public boolean isSuccess() {108         return isSuccess;109     }110 111     /**112      * @param isSuccess the isSuccess to set113      */114     public void setSuccess(boolean isSuccess) {115         this.isSuccess = isSuccess;116     }117 118     /**119      * @return the executeTime120      */121     public String getExecuteTime() {122         return executeTime;123     }124 125     /**126      * @param executeTime the executeTime to set127      */128     public void setExecuteTime(String executeTime) {129         this.executeTime = executeTime;130     }131 132     /**133      * @return the failedReasons134      */135     public String getFailedReasons() {136         return failedReasons;137     }138 139     /**140      * @param failedReasons the failedReasons to set141      */142     public void setFailedReasons(String failedReasons) {143         this.failedReasons = failedReasons;144     }145 }
View Code

(3.3)ThreadPool 类

1 /** 2  * 0.0.0.1 3  */ 4 package com.auto.system; 5  6 import java.util.concurrent.SynchronousQueue; 7 import java.util.concurrent.ThreadPoolExecutor; 8 import java.util.concurrent.TimeUnit; 9 10 11 /**12  * 13  * @author 高青14  * 2014-5-2815  */16 public class ThreadPool {17     18     /** 默认线程大小 */19     private static final int DEFAULT_THREAD_NUM = 5;20     21     /** 最大线程大小数 */22     private static final int MAX_THREAD_NUM = 10;23     24     /** 最小线程数 */25     private static final int MIN_THREAD_NUM = 5;    26     27     /** 实例对象 */28     private ThreadPoolExecutor pool = null;29 30     /**31      * 构造方法32      * 2014-5-2833      */34     public  ThreadPool() {35         36     }37 38     /**39      * 初始化线程池40      * @author 高青41      * 2014-6-1042      * @return void 空43      */44     private void initializeThreadPool() {45         /*46          * 初始化线程池的大小47          */48         if (pool == null) {49             pool = new ThreadPoolExecutor(50                     DEFAULT_THREAD_NUM, 51                     MAX_THREAD_NUM, 52                     2, 53                     TimeUnit.SECONDS, 54                     new SynchronousQueue
()55 );56 }57 }58 59 /**60 * @return the pool61 */62 public ThreadPoolExecutor getPool() {63 //初始化线程池对象64 initializeThreadPool();65 66 return pool;67 }68 69 /**70 * @param pool the pool to set71 */72 public void setPool(ThreadPoolExecutor pool) {73 this.pool = pool;74 }75 }
View Code

(3.4)GenerateThread 类

1 /**  2  * 0.0.0.1  3  */  4 package com.auto.system;  5   6 import java.util.Date;  7 import java.util.Random;  8 import java.util.concurrent.LinkedBlockingQueue;  9 import java.util.concurrent.locks.Condition; 10 import java.util.concurrent.locks.Lock; 11 import java.util.concurrent.locks.ReentrantLock; 12  13 import org.apache.commons.lang3.time.DateFormatUtils; 14 import org.apache.log4j.Logger; 15  16 /** 17  * 生成线程的类 18  * @author 高青 19  * 2014-5-20 20  */ 21 public class GenerateThread { 22      23     /** 日志对象 */ 24     private static Logger log = Logger.getLogger(GenerateThread.class); 25      26     /** 任务集和(堵塞队列) */ 27     private LinkedBlockingQueue
taskList; 28 29 /** 任务集 中是否还有任务 */ 30 private boolean isExistTask = true; 31 32 /** 取到堵塞队列中下标数 */ 33 private int takeIndex = 0; 34 35 /** 线程是否运行的标识 */ 36 private boolean isGenerateThreadRunning = true; 37 38 /** 当前对象的锁 */ 39 private Lock lock = new ReentrantLock(); 40 41 /** SELECT 类型的 Condition 对象 */ 42 private Condition selectTypeCondition = lock.newCondition(); 43 44 /** COMMIT 类型的 Condition 对象 */ 45 private Condition commitTypeCondition = lock.newCondition(); 46 47 /** TOGETHER 类型的 Condition 对象 */ 48 private Condition togetherTypeCondition = lock.newCondition(); 49 50 /** 51 * 默认构造方法 52 * 2014-5-20 53 */ 54 public GenerateThread() { 55 56 } 57 58 /** 59 * 执行任务 60 * @author 高青 61 * 2014-6-10 62 * @param taskTypeEnum 任务类型 63 * @return void 空 64 */ 65 public void executeTask(TaskTypeEnum taskTypeEnum){ 66 switch (taskTypeEnum) { 67 case SELECT: 68 executeSelectTask(); 69 break; 70 case COMMIT: 71 executeCommitTask(); 72 break; 73 default: 74 try { 75 executeTogetherTask(); 76 } catch (Exception e) { 77 e.printStackTrace(); 78 } 79 break; 80 } 81 } 82 83 /** 84 * 执行 TOGETHER 类型的任务 85 * @author 高青 86 * 2014-6-10 87 * @return void 空 88 */ 89 private void executeTogetherTask() throws Exception{ 90 /* 91 * 在执行时,每执行三个任务,成功2个,失败一个(抛RuntimeException). 92 * 失败的任务必须在规定的时间后被重新执行,只在第三次执行这个任务时成功。 93 * 成功执行的任务,打印“同步任务”+执行到第几条。 94 */ 95 96 int togetherAwaitCount = 1; 97 lock.lock(); 98 while (isExistTask) { 99 100 if (togetherAwaitCount == 2) {101 togetherAwaitCount = 1;102 103 //挂起线程104 togetherTypeCondition.await();105 }106 107 Thread.sleep(500);108 109 try{110 log.info("......同步任务开始执行......");111 112 //随机发生异常的次数(确保只能发生一个)113 int randomExceptionCount = 1;114 115 for (int i = 0; i < 3; i++) {116 Task task = taskList.poll();117 118 //判断队列中,是否还有任务119 if (task == null) {120 log.info("在执行同步任务时,当前队列中,没有可取的任务了!");121 isExistTask = false;122 }else {123 124 try {125 126 if (randomExceptionCount == 1) {127 128 //产生一个 0-2 的随机数,当当前随机数与当前循环数 i 相同时,抛出 RuntimeException 异常129 if (new Random().nextInt(3) == i) {130 //记录异常发生的次数131 randomExceptionCount++;132 133 throw new RuntimeException("执行同步任务,发生异常!当前执行的是第 " + i + "个!");134 }135 }136 137 //设置任务状态为成功,记录成功时间138 task.setExecuteStatus(1);139 task.setSuccess(true);140 task.setExecuteTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));141 142 log.info("同步任务正在执行,当前执行到了第 " + ++takeIndex);143 } catch (RuntimeException e) {144 log.info("...... 同步任务执行到了第 " + ++takeIndex +"但是执行失败......");145 146 //发生异常的任务,需要根据每种任务类型配置的重试间隔时间重新执行,并记录失败原因。147 task.setFailedReasons("失败的原因是:" + e.toString());148 task.setExecuteStatus(1);149 task.setSuccess(false);150 }151 152 //判断是否有执行失败的任务153 if (task.getExecuteStatus() == 1 && !task.isSuccess()) {154 155 log.info("存在执行失败的任务,正在等待 5 秒后,重新执行!");156 157 //等待制定的时候后,重新执行158 Thread.sleep(5*1000);159 160 //只在第三次执行这个任务时成功161 boolean failedExecuteSuccess = true;162 int failedExecuteCount = 0;163 164 while (failedExecuteSuccess) {165 166 //记录执行的次数167 failedExecuteCount++;168 169 log.info("失败后的任务,继续执行,当前是执行的第 " + failedExecuteCount + "次");170 171 //当执行第三次后,结束当前的执行,172 if (failedExecuteCount == 3) {173 174 //第三次的时候,执行成功175 task.setExecuteStatus(1);176 task.setSuccess(true);177 task.setExecuteTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));178 179 log.info("......执行失败的任务,在第三次的时候,执行成功了!......");180 181 failedExecuteSuccess = false;182 }183 }184 }185 }186 }187 togetherAwaitCount++;188 189 selectTypeCondition.signal();190 }finally{191 }192 }193 lock.unlock();194 }195 196 /**197 * 执行 COMMIT 类型的任务198 * @author 高青199 * 2014-6-10200 * @return void 空201 */202 private void executeCommitTask() {203 /*204 * 打印“提交任务”+执行到第几条,并暂停10秒钟。205 */206 int commitAwaitCount = 1;207 lock.lock();208 while (isExistTask) {209 210 if (commitAwaitCount == 2) {211 commitAwaitCount = 1;212 213 try {214 commitTypeCondition.await();215 } catch (InterruptedException e) {216 e.printStackTrace();217 }218 }219 220 try {221 Thread.sleep(500);222 } catch (InterruptedException e1) {223 e1.printStackTrace();224 }225 226 try{227 log.info("......提交任务开始执行......");228 229 Task task = taskList.poll();230 231 //判断队列中,是否还有任务232 if (task == null) {233 log.info("在执行提交任务时,当前队列中,没有可取的任务了!");234 isExistTask = false;235 }else {236 //设置任务状态为成功,记录成功时间237 task.setExecuteStatus(1);238 task.setSuccess(true);239 task.setExecuteTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));240 241 log.info("提交任务正在执行,当前执行到了第 " + ++takeIndex);242 243 //暂停 10 秒钟244 try {245 log.info("提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!");246 Thread.sleep(5*1000);247 } catch (InterruptedException e) {248 log.info("在执行提交任务时,暂停期间,发生异常!");249 e.printStackTrace();250 }251 }252 commitAwaitCount++;253 254 //执行了完了,轮到 COMMIT 类型的任务执行255 togetherTypeCondition.signal();256 }finally{257 }258 }259 lock.unlock();260 }261 262 /**263 * 执行 SELECT 任务264 * @author 高青265 * 2014-6-10266 * @return void 空267 */268 private void executeSelectTask() {269 /*270 * 打印“查询任务”+执行到第几条。271 */272 273 int selectAwaitCount = 1;274 275 lock.lock();276 while (isExistTask) {277 278 //当前任务第一个执行,在初始时,线程不挂起279 if (selectAwaitCount == 2) {280 try {281 //重置 selectAwaitCount 的值282 selectAwaitCount = 1;283 284 selectTypeCondition.await();285 } catch (InterruptedException e) {286 e.printStackTrace();287 }288 }289 290 try {291 Thread.sleep(500);292 } catch (InterruptedException e) {293 e.printStackTrace();294 }295 296 try{297 log.info("......查询任务开始执行......");298 299 Task task = taskList.poll();300 301 //判断队列中,是否还有任务302 if (task == null) {303 log.info("在执行查询任务时, 当前队列中,没有可取的任务了!");304 isExistTask = false;305 }else {306 //设置任务状态为成功,记录成功时间307 task.setExecuteStatus(1);308 task.setSuccess(true);309 task.setExecuteTime(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));310 311 log.info("查询任务正在执行,当前执行到了第 " + ++takeIndex);312 }313 314 selectAwaitCount++;315 316 //查询任务执行完后,执行 提交任务317 commitTypeCondition.signal();318 }finally{319 }320 }321 lock.unlock();322 }323 324 /**325 * 生成任务326 * @author 高青327 * 2014-5-20328 * @return taskList 任务集329 */330 public void generateTask(){331 //初始化任务集对象332 taskList = new LinkedBlockingQueue
();333 334 /*335 * 每秒钟生成个5任务,每个任务类型是随机选择的三种任务之一336 * (1)每秒钟生成个5任务,默认执行一分钟337 * (2)将生成后的任务添加到 taskList338 */339 340 //保证必须执行完生成线程后,再去执行别的线程341 lock.lock();342 try {343 //(1)每秒钟生成个5任务,默认执行一分钟344 while (isGenerateThreadRunning) {345 log.info("生成任务开始");346 347 //每隔一秒钟执行一次348 try {349 Thread.sleep(1000);350 } catch (InterruptedException e) {351 log.info("在生成任务时,休眠一秒钟发生异常!");352 e.printStackTrace();353 }354 355 for (int i = 0; i < 5; i++) {356 //初始化任务对象357 Task task = new Task(TaskTypeEnum.getRandomTaskTypeEnum(), -1, false, null, null);358 359 //将任务添加到任务集中360 taskList.offer(task);361 }362 }363 }finally{364 lock.unlock();365 }366 }367 368 /**369 * @return the taskList370 */371 public LinkedBlockingQueue
getTaskList() {372 return taskList;373 }374 375 /**376 * @param taskList the taskList to set377 */378 public void setTaskList(LinkedBlockingQueue
taskList) {379 this.taskList = taskList;380 }381 382 /**383 * @return the isGenerateThreadRunning384 */385 public boolean isGenerateThreadRunning() {386 return isGenerateThreadRunning;387 }388 389 /**390 * @param isGenerateThreadRunning the isGenerateThreadRunning to set391 */392 public void setGenerateThreadRunning(boolean isGenerateThreadRunning) {393 this.isGenerateThreadRunning = isGenerateThreadRunning;394 }395 396 }

 (3.4)测试类(MainTest)

1 /** 2  * 0.0.0.1 3  */ 4 package com.auto.system.test; 5  6 import java.util.concurrent.ThreadPoolExecutor; 7  8 import com.auto.system.GenerateThread; 9 import com.auto.system.TaskTypeEnum;10 import com.auto.system.ThreadPool;11 12 /**13  * 主测试类14  * @author 高青15  * 2014-6-1016  */17 public class MainTest {18 19     /**20      * 构造方法21      * 2014-6-1022      */23     public MainTest() {24         super();25     }26 27     /**28      * 主线程方法29      * @author 高青30      * 2014-6-1031      * @param args  字符串参数集32      * @return void 空33      */34     public static void main(String[] args) {35         /*36          * 1、实例化 GenerateThread 对象37          * 2、得到线程池38          * 3、执行生成任务的方法39          * 4、执行三种不同的执行任务40          */41         42         //1、实例化 GenerateThread 对象43         final GenerateThread generateThread = new GenerateThread();44         45         //2、得到线程池46         ThreadPool threadPool = new ThreadPool();47         ThreadPoolExecutor pool = threadPool.getPool();48         49         //3、执行生成任务的方法50         pool.execute(new Runnable() {51             @Override52             public void run() {53                 generateThread.generateTask();54             }55         });56         57         //1 分钟后,停止生成线程58         try {59             Thread.sleep(10*1000);60         } catch (InterruptedException e1) {61             e1.printStackTrace();62         }63         generateThread.setGenerateThreadRunning(false);64         65         //4、执行三种不同的执行任务66         //(1)查询任务67         pool.execute(new Runnable() {68             @Override69             public void run() {70                 generateThread.executeTask(TaskTypeEnum.SELECT);71             }72         });73         74         //(2)提交任务75         pool.execute(new Runnable() {76             @Override77             public void run() {78                 generateThread.executeTask(TaskTypeEnum.COMMIT);79             }80         });81         82         //(3)同步任务83         pool.execute(new Runnable() {84             @Override85             public void run() {86                 generateThread.executeTask(TaskTypeEnum.TOGETHER);87             }88         });89         90         // 3 分钟后,停止线程91         try {92             Thread.sleep(2*60*1000);93         } catch (InterruptedException e) {94             e.printStackTrace();95         }96         pool.shutdown();97     }98 }
View Code

(3.5)执行的结果是:

2014-06-22 18:08:12,121 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:13,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:14,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:15,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:16,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:17,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:18,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:19,126 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:20,127 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:21,127 INFO [com.auto.system.GenerateThread] - 生成任务开始2014-06-22 18:08:22,680 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:08:22,773 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 12014-06-22 18:08:23,274 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:08:23,274 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 22014-06-22 18:08:23,274 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:08:28,775 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:08:28,775 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 32014-06-22 18:08:28,776 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 4但是执行失败......2014-06-22 18:08:28,776 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:08:33,776 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:08:33,777 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:08:33,777 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:08:33,777 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:08:33,777 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 52014-06-22 18:08:34,279 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:08:34,279 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 62014-06-22 18:08:34,780 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:08:34,780 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 72014-06-22 18:08:34,780 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:08:40,281 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:08:40,281 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 82014-06-22 18:08:40,281 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 92014-06-22 18:08:40,282 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 102014-06-22 18:08:40,783 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:08:40,783 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 112014-06-22 18:08:41,283 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:08:41,283 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 122014-06-22 18:08:41,283 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:08:46,783 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:08:46,783 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 13但是执行失败......2014-06-22 18:08:46,783 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:08:51,783 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:08:51,783 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:08:51,783 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:08:51,783 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:08:51,783 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 142014-06-22 18:08:51,784 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 152014-06-22 18:08:52,284 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:08:52,284 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 162014-06-22 18:08:52,784 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:08:52,784 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 172014-06-22 18:08:52,784 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:08:58,285 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:08:58,285 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 182014-06-22 18:08:58,285 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 19但是执行失败......2014-06-22 18:08:58,285 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:09:03,286 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:09:03,286 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:09:03,286 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:09:03,286 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:09:03,287 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 202014-06-22 18:09:03,787 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:03,787 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 212014-06-22 18:09:04,287 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:04,287 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 222014-06-22 18:09:04,287 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 232014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 242014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 252014-06-22 18:09:10,288 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:10,288 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 262014-06-22 18:09:10,788 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:10,788 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 272014-06-22 18:09:10,788 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:16,289 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:16,289 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 282014-06-22 18:09:16,289 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 29但是执行失败......2014-06-22 18:09:16,289 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:09:21,289 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:09:21,289 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:09:21,289 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:09:21,289 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:09:21,289 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 302014-06-22 18:09:21,790 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:21,790 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 312014-06-22 18:09:22,291 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:22,291 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 322014-06-22 18:09:22,291 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:27,791 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:27,791 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 332014-06-22 18:09:27,791 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 34但是执行失败......2014-06-22 18:09:27,791 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:09:32,792 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:09:32,792 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:09:32,792 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:09:32,792 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:09:32,792 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 352014-06-22 18:09:33,293 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:33,293 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 362014-06-22 18:09:33,793 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:33,794 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 372014-06-22 18:09:33,794 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:39,294 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:39,294 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 382014-06-22 18:09:39,294 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 39但是执行失败......2014-06-22 18:09:39,295 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:09:44,295 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:09:44,295 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:09:44,295 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:09:44,295 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:09:44,295 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 402014-06-22 18:09:44,795 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:44,795 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 412014-06-22 18:09:45,295 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:45,295 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 422014-06-22 18:09:45,295 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:50,797 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:50,797 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 432014-06-22 18:09:50,797 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 442014-06-22 18:09:50,798 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 452014-06-22 18:09:51,298 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:09:51,298 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 462014-06-22 18:09:51,798 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:09:51,798 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 472014-06-22 18:09:51,798 INFO [com.auto.system.GenerateThread] - 提交任务执行完成,正在暂停中,暂停时间为 5 秒钟!2014-06-22 18:09:57,298 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:09:57,298 INFO [com.auto.system.GenerateThread] - ...... 同步任务执行到了第 48但是执行失败......2014-06-22 18:09:57,298 INFO [com.auto.system.GenerateThread] - 存在执行失败的任务,正在等待 5 秒后,重新执行!2014-06-22 18:10:02,298 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 1次2014-06-22 18:10:02,298 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 2次2014-06-22 18:10:02,298 INFO [com.auto.system.GenerateThread] - 失败后的任务,继续执行,当前是执行的第 3次2014-06-22 18:10:02,299 INFO [com.auto.system.GenerateThread] - ......执行失败的任务,在第三次的时候,执行成功了!......2014-06-22 18:10:02,299 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 492014-06-22 18:10:02,299 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 502014-06-22 18:10:02,799 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行......2014-06-22 18:10:02,799 INFO [com.auto.system.GenerateThread] - 在执行查询任务时, 当前队列中,没有可取的任务了!2014-06-22 18:10:03,299 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行......2014-06-22 18:10:03,299 INFO [com.auto.system.GenerateThread] - 在执行提交任务时,当前队列中,没有可取的任务了!2014-06-22 18:10:03,799 INFO [com.auto.system.GenerateThread] - ......同步任务开始执行......2014-06-22 18:10:03,799 INFO [com.auto.system.GenerateThread] - 在执行同步任务时,当前队列中,没有可取的任务了!2014-06-22 18:10:03,799 INFO [com.auto.system.GenerateThread] - 在执行同步任务时,当前队列中,没有可取的任务了!2014-06-22 18:10:03,799 INFO [com.auto.system.GenerateThread] - 在执行同步任务时,当前队列中,没有可取的任务了!
View Code

(3.6)总结说明

上面就是我所编写的程序,从执行的结果可以看出,我是将执行的任务按照顺序的执行了,首先执行 SELECT 任务,然后执行 COMMIT 类型的任务,最后执行 TOGETHER 类型的任务,这样往复的执行下去,直到任务执行完后,线程停止。

在 GenerateThread 类中,我使用 java5 的 concurrent 包下的类及接口进行了线程的同步操作,使用 Lock 接口,代替了之前的 Synchronized 的关键字,使用 Condition 接口,代替了 wait() 、notify() 方法,上面的这种做法,则更加灵活和有针对性的唤醒等待的线程。使用了无界堵塞队列 LinkedBlockingQueue<Task> 存放生成的任务,这样可以简便和合理的管控生产和消费的问题。

转载于:https://www.cnblogs.com/gaoqing/p/3802797.html

你可能感兴趣的文章
11g dataguard 类型、保护模式、服务
查看>>
Scala-基础-数组(1)
查看>>
小程序客服消息推送公众号文章 引导关注公众号的操作方法
查看>>
PHP+Mysql 实现数据库增删改查
查看>>
MVC4下配置log4net 五部曲
查看>>
PHP全栈开发(七):PHP与MySQL存储交互(2.插入、读取)
查看>>
《网络攻防实践》第十周作业
查看>>
Trick
查看>>
静态路由的配置
查看>>
Python多继承解析顺序的C3线性算法流程解析
查看>>
2018CCPC 吉林现场赛 赛后总结
查看>>
JavaScript快速入门
查看>>
Linux下Kafka单机安装配置
查看>>
sort
查看>>
linux网络配置及IP绑定
查看>>
HttpClient教程
查看>>
js继承方式
查看>>
java CPU 100% 排查
查看>>
关于动态内存和输入输出文件
查看>>
如何理解人工智能、机器学习和深度学习三者的关系
查看>>