这个自动任务调度系统的来由是这样的:前段时间,在一个 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 枚举
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
(3.2)Task 类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
(3.3)ThreadPool 类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
(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 LinkedBlockingQueuetaskList; 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)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }
(3.5)执行的结果是:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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] - 在执行同步任务时,当前队列中,没有可取的任务了!
(3.6)总结说明
上面就是我所编写的程序,从执行的结果可以看出,我是将执行的任务按照顺序的执行了,首先执行 SELECT 任务,然后执行 COMMIT 类型的任务,最后执行 TOGETHER 类型的任务,这样往复的执行下去,直到任务执行完后,线程停止。
在 GenerateThread 类中,我使用 java5 的 concurrent 包下的类及接口进行了线程的同步操作,使用 Lock 接口,代替了之前的 Synchronized 的关键字,使用 Condition 接口,代替了 wait() 、notify() 方法,上面的这种做法,则更加灵活和有针对性的唤醒等待的线程。使用了无界堵塞队列 LinkedBlockingQueue<Task> 存放生成的任务,这样可以简便和合理的管控生产和消费的问题。