这个自动任务调度系统的来由是这样的:前段时间,在一个 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-20 12 */ 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-10 26 * @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 类
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 isSuccess 106 */ 107 public boolean isSuccess() { 108 return isSuccess; 109 } 110 111 /** 112 * @param isSuccess the isSuccess to set 113 */ 114 public void setSuccess(boolean isSuccess) { 115 this.isSuccess = isSuccess; 116 } 117 118 /** 119 * @return the executeTime 120 */ 121 public String getExecuteTime() { 122 return executeTime; 123 } 124 125 /** 126 * @param executeTime the executeTime to set 127 */ 128 public void setExecuteTime(String executeTime) { 129 this.executeTime = executeTime; 130 } 131 132 /** 133 * @return the failedReasons 134 */ 135 public String getFailedReasons() { 136 return failedReasons; 137 } 138 139 /** 140 * @param failedReasons the failedReasons to set 141 */ 142 public void setFailedReasons(String failedReasons) { 143 this.failedReasons = failedReasons; 144 } 145 }
(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-28 15 */ 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-28 33 */ 34 public ThreadPool() { 35 36 } 37 38 /** 39 * 初始化线程池 40 * @author 高青 41 * 2014-6-10 42 * @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<Runnable>() 55 ); 56 } 57 } 58 59 /** 60 * @return the pool 61 */ 62 public ThreadPoolExecutor getPool() { 63 //初始化线程池对象 64 initializeThreadPool(); 65 66 return pool; 67 } 68 69 /** 70 * @param pool the pool to set 71 */ 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 LinkedBlockingQueue<Task> 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-10 200 * @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-10 266 * @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-20 328 * @return taskList 任务集 329 */ 330 public void generateTask(){ 331 //初始化任务集对象 332 taskList = new LinkedBlockingQueue<Task>(); 333 334 /* 335 * 每秒钟生成个5任务,每个任务类型是随机选择的三种任务之一 336 * (1)每秒钟生成个5任务,默认执行一分钟 337 * (2)将生成后的任务添加到 taskList 338 */ 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 taskList 370 */ 371 public LinkedBlockingQueue<Task> getTaskList() { 372 return taskList; 373 } 374 375 /** 376 * @param taskList the taskList to set 377 */ 378 public void setTaskList(LinkedBlockingQueue<Task> taskList) { 379 this.taskList = taskList; 380 } 381 382 /** 383 * @return the isGenerateThreadRunning 384 */ 385 public boolean isGenerateThreadRunning() { 386 return isGenerateThreadRunning; 387 } 388 389 /** 390 * @param isGenerateThreadRunning the isGenerateThreadRunning to set 391 */ 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-10 16 */ 17 public class MainTest { 18 19 /** 20 * 构造方法 21 * 2014-6-10 22 */ 23 public MainTest() { 24 super(); 25 } 26 27 /** 28 * 主线程方法 29 * @author 高青 30 * 2014-6-10 31 * @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 @Override 52 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 @Override 69 public void run() { 70 generateThread.executeTask(TaskTypeEnum.SELECT); 71 } 72 }); 73 74 //(2)提交任务 75 pool.execute(new Runnable() { 76 @Override 77 public void run() { 78 generateThread.executeTask(TaskTypeEnum.COMMIT); 79 } 80 }); 81 82 //(3)同步任务 83 pool.execute(new Runnable() { 84 @Override 85 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)执行的结果是:
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] - 查询任务正在执行,当前执行到了第 1 2014-06-22 18:08:23,274 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:08:23,274 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 2 2014-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] - 同步任务正在执行,当前执行到了第 3 2014-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] - 同步任务正在执行,当前执行到了第 5 2014-06-22 18:08:34,279 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:08:34,279 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 6 2014-06-22 18:08:34,780 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:08:34,780 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 7 2014-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] - 同步任务正在执行,当前执行到了第 8 2014-06-22 18:08:40,281 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 9 2014-06-22 18:08:40,282 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 10 2014-06-22 18:08:40,783 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:08:40,783 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 11 2014-06-22 18:08:41,283 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:08:41,283 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 12 2014-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] - 同步任务正在执行,当前执行到了第 14 2014-06-22 18:08:51,784 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 15 2014-06-22 18:08:52,284 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:08:52,284 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 16 2014-06-22 18:08:52,784 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:08:52,784 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 17 2014-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] - 同步任务正在执行,当前执行到了第 18 2014-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] - 同步任务正在执行,当前执行到了第 20 2014-06-22 18:09:03,787 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:03,787 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 21 2014-06-22 18:09:04,287 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:04,287 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 22 2014-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] - 同步任务正在执行,当前执行到了第 23 2014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 24 2014-06-22 18:09:09,787 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 25 2014-06-22 18:09:10,288 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:10,288 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 26 2014-06-22 18:09:10,788 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:10,788 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 27 2014-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] - 同步任务正在执行,当前执行到了第 28 2014-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] - 同步任务正在执行,当前执行到了第 30 2014-06-22 18:09:21,790 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:21,790 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 31 2014-06-22 18:09:22,291 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:22,291 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 32 2014-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] - 同步任务正在执行,当前执行到了第 33 2014-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] - 同步任务正在执行,当前执行到了第 35 2014-06-22 18:09:33,293 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:33,293 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 36 2014-06-22 18:09:33,793 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:33,794 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 37 2014-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] - 同步任务正在执行,当前执行到了第 38 2014-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] - 同步任务正在执行,当前执行到了第 40 2014-06-22 18:09:44,795 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:44,795 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 41 2014-06-22 18:09:45,295 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:45,295 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 42 2014-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] - 同步任务正在执行,当前执行到了第 43 2014-06-22 18:09:50,797 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 44 2014-06-22 18:09:50,798 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 45 2014-06-22 18:09:51,298 INFO [com.auto.system.GenerateThread] - ......查询任务开始执行...... 2014-06-22 18:09:51,298 INFO [com.auto.system.GenerateThread] - 查询任务正在执行,当前执行到了第 46 2014-06-22 18:09:51,798 INFO [com.auto.system.GenerateThread] - ......提交任务开始执行...... 2014-06-22 18:09:51,798 INFO [com.auto.system.GenerateThread] - 提交任务正在执行,当前执行到了第 47 2014-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] - 同步任务正在执行,当前执行到了第 49 2014-06-22 18:10:02,299 INFO [com.auto.system.GenerateThread] - 同步任务正在执行,当前执行到了第 50 2014-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> 存放生成的任务,这样可以简便和合理的管控生产和消费的问题。