• 自动任务调度系统


      这个自动任务调度系统的来由是这样的:前段时间,在一个 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> 存放生成的任务,这样可以简便和合理的管控生产和消费的问题。

  • 相关阅读:
    DOS批量递归删除文件夹
    根据关键词kill进程
    docker创建镜像的几个命令
    OpenSSL命令---passwd
    A configuration with this name already exists
    查看Linux版本
    ubuntu初次安装后设置root用户密码
    [转载]气象数据集下载网站(包括中国700多个站)
    将界面从屏幕外拖回来方法
    使用GitHub分享代码
  • 原文地址:https://www.cnblogs.com/gaoqing/p/3802797.html
Copyright © 2020-2023  润新知