<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    春風(fēng)博客

    春天里,百花香...

    導(dǎo)航

    <2007年10月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    統(tǒng)計(jì)

    公告

    MAIL: junglesong@gmail.com
    MSN: junglesong_5@hotmail.com

    Locations of visitors to this page

    常用鏈接

    留言簿(11)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    工人自動(dòng)獲取任務(wù)的OO分析

    這篇文章是"調(diào)度員,工人及任務(wù)的OO分析過(guò)程"的續(xù)篇.

    上次的情況是由調(diào)度員主動(dòng)分配任務(wù),但有些情況下需要工人自動(dòng)取得任務(wù)而不是由調(diào)度員分配,這時(shí)需要對(duì)線程進(jìn)行通知,使用的主要方法就是對(duì)象的wait(),notify(),notifyAll()三個(gè)函數(shù),它們都必須從同步方法(synchronized method)中調(diào)用.

    這種情況下事務(wù)的大致流程是:工人從任務(wù)庫(kù)中取得一項(xiàng)任務(wù)進(jìn)行作業(yè),完成后再取下一項(xiàng),如果任務(wù)庫(kù)中沒(méi)有任務(wù)則進(jìn)入等待狀態(tài),如果任務(wù)庫(kù)有新任務(wù)則通知工人來(lái)取.

    這次新引入了一個(gè)任務(wù)庫(kù)類TaskLibrary,它取代了上次的調(diào)度員類,代碼如下:
    package com.sitinspring.autotask.domain;

    import java.util.LinkedList;
    import java.util.List;

    /**
     * 任務(wù)庫(kù)類
     * 
     * 
    @author sitinspring(junglesong@gmail.com)
     * 
     
    */

    public class TaskLibrary {
        
    private List<Task> tasks;

        
    public TaskLibrary() {
            tasks 
    = new LinkedList<Task>();
        }


        
    // 添加單個(gè)任務(wù)
        public synchronized void addTask(Task task) {
            tasks.add(task);
            notifyAll();
        }


        
    // 添加多個(gè)任務(wù)
        public synchronized void addTasks(List<Task> moreTasks) {
            tasks.addAll(moreTasks);
            notifyAll();
        }


        
    public int getTaskSize() {
            
    return tasks.size();
        }


        
    // 工人領(lǐng)受任務(wù)
        public synchronized Task fetchTask(Worker worker) {
            
    while (tasks.size() == 0{
                
    try {
                    System.out.println(
    "任務(wù)告罄");
                    System.out.println(
    "工人:" + worker.getName() + "進(jìn)入閑置狀態(tài)");
                    wait();
                }
     catch (InterruptedException ex1) {
                    ex1.printStackTrace();
                }

            }


            Task task 
    = tasks.get(0);
            System.out.println(
    "工人:" + worker.getName() + "取得任務(wù):" + task.getName());
            tasks.remove(task);
            
    return task;
        }

    }

    其中,fetchTask通過(guò)調(diào)用wait方法,實(shí)現(xiàn)了沒(méi)有任務(wù)時(shí)則對(duì)自己(this)加鎖(lock),以讓進(jìn)入的線程等待,否則讓工人取走最開(kāi)頭的任務(wù).
    而addTask和addTasks通過(guò)調(diào)用notifyAll方法,通知等待的線程可以繼續(xù)進(jìn)行原來(lái)陷入等待狀態(tài)的流程.

    在這種情況下,工人類只需關(guān)心當(dāng)前任務(wù)即可,它無(wú)須保存一個(gè)任務(wù)列表,具體代碼如下:
    package com.sitinspring.autotask.domain;

    import com.sitinspring.autotask.util.IdUtil;

    public class Worker implements Runnable {
        
    private String id;

        
    private String name;

        
    private Task currTask;

        
    private TaskLibrary taskLibrary;

        
    // 工作速度
        private int speed;

        
    public Worker(String name, int speed, TaskLibrary taskLibrary) {
            id 
    = IdUtil.generateId();
            
    this.currTask = null;
            
    this.name = name;
            
    this.speed = speed;
            
    this.taskLibrary = taskLibrary;

            doWork();
        }


        
    // 開(kāi)始干活
        public void doWork() {
            Thread thread 
    = new Thread(this);
            thread.start();
        }


        
    // 真正干活
        public void run() {
            
    while (true{
                
    if (currTask == null || currTask.isCompleted()) {
                    currTask 
    = taskLibrary.fetchTask(this);
                    currTask.setWorker(
    this);
                }


                
    try {
                    Thread.sleep(
    1000);
                    System.out.println(
    "正在處理的任務(wù)" + currTask + " 完成度"
                            
    + currTask.getCompletedRatio() + "個(gè).");
                    currTask.addCompleted(speed);
                }
     catch (Exception ex) {
                    ex.printStackTrace();
                }

            }

        }


        
    public String getName() {
            
    return name;
        }


        
    public void setName(String name) {
            
    this.name = name;
        }


        
    public String getId() {
            
    return id;
        }

    }
    它的Run方法實(shí)現(xiàn)了不斷取活干活的過(guò)程,因?yàn)榫唧w進(jìn)入等待是TaskLibrary做的,所以這個(gè)類代碼很簡(jiǎn)單,這里就不贅述了.

    執(zhí)行過(guò)程如下:
    package com.sitinspring.autotask;

    import java.util.LinkedList;
    import java.util.List;

    import com.sitinspring.autotask.domain.Task;
    import com.sitinspring.autotask.domain.TaskLibrary;
    import com.sitinspring.autotask.domain.Worker;


    public class Test{
        
    public static void main(String[] args){
            TaskLibrary taskLibrary
    =new TaskLibrary();        
            
            taskLibrary.addTask(
    new Task("培訓(xùn)",8));
            
            List
    <Task> moreTasks=new LinkedList<Task>();
            moreTasks.add(
    new Task("鍛造",4));
            moreTasks.add(
    new Task("打磨",5));
            moreTasks.add(
    new Task("車階梯",6));
            moreTasks.add(
    new Task("熱處理",7));
            moreTasks.add(
    new Task("去皮",8));
            moreTasks.add(
    new Task("鏜孔",60));
            moreTasks.add(
    new Task("鉆孔",10));
            moreTasks.add(
    new Task("拉槽",11));
            
            taskLibrary.addTasks(moreTasks);    
            
            Worker worker01
    =new Worker("王進(jìn)喜",1,taskLibrary);
            Worker worker02
    =new Worker("時(shí)傳詳",2,taskLibrary);
            Worker worker03
    =new Worker("張秉貴",3,taskLibrary);
            Worker worker04
    =new Worker("徐虎",3,taskLibrary);
            
            taskLibrary.addTask(
    new Task("鑄造",8));
            sleep(
    1);
            taskLibrary.addTask(
    new Task("校驗(yàn)",9));
            sleep(
    2);
            taskLibrary.addTask(
    new Task("內(nèi)務(wù)",10));
            sleep(
    3);
        }

        
        
    private static void sleep(int sleepSecond){
            
    try{
                Thread.sleep(sleepSecond
    *1000);
            }

            
    catch(Exception ex){
                ex.printStackTrace();
            }

        }

    }


    執(zhí)行效果如下:
    工人:王進(jìn)喜取得任務(wù):培訓(xùn)
    工人:時(shí)傳詳取得任務(wù):鍛造
    工人:張秉貴取得任務(wù):打磨
    工人:徐虎取得任務(wù):車階梯
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鍛造 工人名:時(shí)傳詳 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:打磨 工人名:張秉貴 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:車階梯 工人名:徐虎 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    12% 完成度 完成度:12%個(gè).
    正在處理的任務(wù)任務(wù)名:鍛造 工人名:時(shí)傳詳 完成度:
    50% 完成度 完成度:50%個(gè).
    任務(wù)任務(wù)名:鍛造 工人名:時(shí)傳詳 完成度:
    100%處理完畢!
    工人:時(shí)傳詳取得任務(wù):熱處理
    正在處理的任務(wù)任務(wù)名:打磨 工人名:張秉貴 完成度:
    60% 完成度 完成度:60%個(gè).
    任務(wù)任務(wù)名:打磨 工人名:張秉貴 完成度:
    100%處理完畢!
    正在處理的任務(wù)任務(wù)名:車階梯 工人名:徐虎 完成度:
    50% 完成度 完成度:50%個(gè).
    任務(wù)任務(wù)名:車階梯 工人名:徐虎 完成度:
    100%處理完畢!
    工人:徐虎取得任務(wù):去皮
    工人:張秉貴取得任務(wù):鏜孔
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    25% 完成度 完成度:25%個(gè).
    正在處理的任務(wù)任務(wù)名:熱處理 工人名:時(shí)傳詳 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:去皮 工人名:徐虎 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    37% 完成度 完成度:37%個(gè).
    正在處理的任務(wù)任務(wù)名:熱處理 工人名:時(shí)傳詳 完成度:
    28% 完成度 完成度:28%個(gè).
    正在處理的任務(wù)任務(wù)名:去皮 工人名:徐虎 完成度:
    37% 完成度 完成度:37%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    5% 完成度 完成度:5%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    50% 完成度 完成度:50%個(gè).
    正在處理的任務(wù)任務(wù)名:熱處理 工人名:時(shí)傳詳 完成度:
    57% 完成度 完成度:57%個(gè).
    正在處理的任務(wù)任務(wù)名:去皮 工人名:徐虎 完成度:
    75% 完成度 完成度:75%個(gè).
    任務(wù)任務(wù)名:去皮 工人名:徐虎 完成度:
    100%處理完畢!
    工人:徐虎取得任務(wù):鉆孔
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    10% 完成度 完成度:10%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    62% 完成度 完成度:62%個(gè).
    正在處理的任務(wù)任務(wù)名:熱處理 工人名:時(shí)傳詳 完成度:
    85% 完成度 完成度:85%個(gè).
    任務(wù)任務(wù)名:熱處理 工人名:時(shí)傳詳 完成度:
    100%處理完畢!
    工人:時(shí)傳詳取得任務(wù):拉槽
    正在處理的任務(wù)任務(wù)名:鉆孔 工人名:徐虎 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    15% 完成度 完成度:15%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    75% 完成度 完成度:75%個(gè).
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鉆孔 工人名:徐虎 完成度:
    30% 完成度 完成度:30%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    20% 完成度 完成度:20%個(gè).
    正在處理的任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    87% 完成度 完成度:87%個(gè).
    任務(wù)任務(wù)名:培訓(xùn) 工人名:王進(jìn)喜 完成度:
    100%處理完畢!
    工人:王進(jìn)喜取得任務(wù):鑄造
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    18% 完成度 完成度:18%個(gè).
    正在處理的任務(wù)任務(wù)名:鉆孔 工人名:徐虎 完成度:
    60% 完成度 完成度:60%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    25% 完成度 完成度:25%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    36% 完成度 完成度:36%個(gè).
    正在處理的任務(wù)任務(wù)名:鉆孔 工人名:徐虎 完成度:
    90% 完成度 完成度:90%個(gè).
    任務(wù)任務(wù)名:鉆孔 工人名:徐虎 完成度:
    100%處理完畢!
    工人:徐虎取得任務(wù):校驗(yàn)
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    30% 完成度 完成度:30%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    12% 完成度 完成度:12%個(gè).
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    54% 完成度 完成度:54%個(gè).
    正在處理的任務(wù)任務(wù)名:校驗(yàn) 工人名:徐虎 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    35% 完成度 完成度:35%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    25% 完成度 完成度:25%個(gè).
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    72% 完成度 完成度:72%個(gè).
    正在處理的任務(wù)任務(wù)名:校驗(yàn) 工人名:徐虎 完成度:
    33% 完成度 完成度:33%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    40% 完成度 完成度:40%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    37% 完成度 完成度:37%個(gè).
    正在處理的任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    90% 完成度 完成度:90%個(gè).
    任務(wù)任務(wù)名:拉槽 工人名:時(shí)傳詳 完成度:
    100%處理完畢!
    工人:時(shí)傳詳取得任務(wù):內(nèi)務(wù)
    正在處理的任務(wù)任務(wù)名:校驗(yàn) 工人名:徐虎 完成度:
    66% 完成度 完成度:66%個(gè).
    任務(wù)任務(wù)名:校驗(yàn) 工人名:徐虎 完成度:
    100%處理完畢!
    任務(wù)告罄
    工人:徐虎進(jìn)入閑置狀態(tài)
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    45% 完成度 完成度:45%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    50% 完成度 完成度:50%個(gè).
    正在處理的任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    0% 完成度 完成度:0%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    50% 完成度 完成度:50%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    62% 完成度 完成度:62%個(gè).
    正在處理的任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    20% 完成度 完成度:20%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    55% 完成度 完成度:55%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    75% 完成度 完成度:75%個(gè).
    正在處理的任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    40% 完成度 完成度:40%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    60% 完成度 完成度:60%個(gè).
    正在處理的任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    87% 完成度 完成度:87%個(gè).
    任務(wù)任務(wù)名:鑄造 工人名:王進(jìn)喜 完成度:
    100%處理完畢!
    任務(wù)告罄
    工人:王進(jìn)喜進(jìn)入閑置狀態(tài)
    正在處理的任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    60% 完成度 完成度:60%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    65% 完成度 完成度:65%個(gè).
    正在處理的任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    80% 完成度 完成度:80%個(gè).
    任務(wù)任務(wù)名:內(nèi)務(wù) 工人名:時(shí)傳詳 完成度:
    100%處理完畢!
    任務(wù)告罄
    工人:時(shí)傳詳進(jìn)入閑置狀態(tài)
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    70% 完成度 完成度:70%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    75% 完成度 完成度:75%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    80% 完成度 完成度:80%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    85% 完成度 完成度:85%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    90% 完成度 完成度:90%個(gè).
    正在處理的任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    95% 完成度 完成度:95%個(gè).
    任務(wù)任務(wù)名:鏜孔 工人名:張秉貴 完成度:
    100%處理完畢!
    任務(wù)告罄
    工人:張秉貴進(jìn)入閑置狀態(tài)

    代碼下載:
    http://www.tkk7.com/Files/sitinspring/AutoTask20071020100536.rar


    posted on 2007-10-20 09:53 sitinspring 閱讀(873) 評(píng)論(0)  編輯  收藏 所屬分類: Object Orient Programming

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 亚洲熟妇色自偷自拍另类| 四虎一区二区成人免费影院网址| 成年女人毛片免费视频| 国产成人精品久久亚洲高清不卡| 日本亚洲国产一区二区三区| 最近2019免费中文字幕6| 色综合久久精品亚洲国产| 亚洲精品中文字幕无码蜜桃| 毛片免费视频在线观看| 中文字幕视频在线免费观看| 亚洲图片激情小说| 在线观看亚洲成人| 成人激情免费视频| 嫩草成人永久免费观看| 久久亚洲精品高潮综合色a片| 亚洲av午夜福利精品一区人妖| 国产精品极品美女免费观看| 国产午夜免费高清久久影院| 亚洲AV永久无码精品网站在线观看 | 亚洲国产女人aaa毛片在线 | 亚洲AV无码国产精品麻豆天美 | 国产在线a不卡免费视频| 一区二区免费视频| 狠狠热精品免费观看| 亚洲人成网站日本片| 亚洲精品乱码久久久久久按摩| 韩国欧洲一级毛片免费 | 亚洲精品国产成人专区| 亚洲国产91精品无码专区| 无码人妻一区二区三区免费| 国色精品va在线观看免费视频| 亚洲人成无码网站在线观看| 亚洲精品在线免费看| 亚洲国产第一站精品蜜芽| 亚洲国产一区二区三区| 午夜毛片不卡免费观看视频| 久久久久久久免费视频| 免费无遮挡无码永久视频| 免费看黄的成人APP| 亚洲免费无码在线| 一级毛片免费播放男男|