自动任务调度系统

  这个自动任务调度系统的来由是这样的:前段时间,在一个 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 }
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 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 }
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-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 }
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<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 }
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] - 查询任务正在执行,当前执行到了第 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] - 在执行同步任务时,当前队列中,没有可取的任务了!
View Code

(3.6)总结说明

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

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

posted @ 2014-06-22 18:30  绿 叶  阅读(1931)  评论(1编辑  收藏  举报