实现一个简单的任务调度系统,使用 JDK 中 concurrent 包下的一些接口和类,实现多线程及多线程之间的同步和通信。
这个自动任务调度系统的来由是这样的:前段时间,在一个 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> 存放生成的任务,这样可以简便和合理的管控生产和消费的问题。
















