首页>java频道>java教程>正文
关于使用Java多线程实现任务分发

www.zige365.com 2010-6-7 11:57:13 点击:发送给好友 和学友门交流一下 收藏到我的会员中心
 
  • */   
  • public static List[] distributeTasks(List taskList, int threadCount) {   
  • // 每个线程至少要执行的任务数,假如不为零则表示每个线程都会分配到任务   
  • int minTaskCount = taskList.size() / threadCount;   
  • // 平均分配后还剩下的任务数,不为零则还有任务依个附加到前面的线程中   
  • int remainTaskCount = taskList.size() % threadCount;   
  • // 实际要启动的线程数,如果工作线程比任务还多   
  • // 自然只需要启动与任务相同个数的工作线程,一对一的执行   
  • // 毕竟不打算实现了线程池,所以用不着预先初始化好休眠的线程   
  • int actualThreadCount = minTaskCount > 0 ? threadCount : remainTaskCount;   
  • // 要启动的线程数组,以及每个线程要执行的任务列表   
  • List[] taskListPerThread = new List[actualThreadCount];   
  • int taskIndex = 0;   
  • //平均分配后多余任务,每附加给一个线程后的剩余数,重新声明与 remainTaskCount   
  • //相同的变量,不然会在执行中改变 remainTaskCount 原有值,产生麻烦   
  • int remainIndces = remainTaskCount;   
  • for (int i = 0; i < taskListPerThread.length; i++) {   
  • taskListPerThread[i] = new ArrayList();   
  • // 如果大于零,线程要分配到基本的任务   
  • if (minTaskCount > 0) {   
  • for (int j = taskIndex; j < minTaskCount + taskIndex; j++) {   
  • taskListPerThread[i].add(taskList.get(j));   
  • }   
  • taskIndex += minTaskCount;   
  • }   
  • // 假如还有剩下的,则补一个到这个线程中   
  • if (remainIndces > 0) {   
  • taskListPerThread[i].add(taskList.get(taskIndex++));   
  • remainIndces--;   
  • }   
  • }   
  • // 打印任务的分配情况   
  • for (int i = 0; i < taskListPerThread.length; i++) {   
  • System.out.println("线程 " + i + " 的任务数:" +    
  •  
  • taskListPerThread[i].size() + " 区间["   
  • + taskListPerThread[i].get(0).getTaskId() + ","   
  • + taskListPerThread[i].get(taskListPerThread[i].size() - 1).getTaskId() + "]");   
  • }   
  • return taskListPerThread;   
  • }   
  • }   
  • /**   
  • * 要执行的任务,可在执行时改变它的某个状态或调用它的某个操作   
  • * 例如任务有三个状态,就绪,运行,完成,默认为就绪态   
  • * 要进一步完善,可为 Task 加上状态变迁的监听器,因之决定UI的显示   
  • */   
  • class Task {   
  • public static 

    本新闻共4页,当前在第2页  1  2  3  4  

  • 我要投稿 新闻来源: 编辑: 作者:
    相关新闻
    Java双括弧技巧:不规范的语法
    关于Java语法技巧之双括弧初始化
    有关Java的synchronized关键字:同步机制总结
    双检测锁定(DCL)和Singleton模式的问题
    关于Smooks 1.2框架:处理XML与非XML的Java框架