和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

工序任务的线程模拟

工序任务指流水线式的工作场景,下一组工人的工件就是上一组工人的成品,一个活做完自己的部分就往下传,直到活完成为止。

为了编程方便简化了各个工序的工时,把它们都当成一样的了。

代码:
package com.sitinspring.autotask.domain;

import com.sitinspring.autotask.util.IdUtil;

/**
 * 任务类
 *
 * @date: 2008-2-25
 
*/

public class Task implements Comparable {
    
private String id;

    
private String name;

    
// 完成需消耗的工时数
    private int manHour;

    
// 已经完成的工时数
    private int completed;

    
// 接受任务者
    private Worker worker;

    
public Task(String name, int manHour) {
        id 
= IdUtil.generateId();
        
this.name = name;
        
this.manHour = manHour;
        
this.completed = 0;
    }


    
// 任务是否完成
    public boolean isCompleted() {
        
return completed >= manHour;
    }


    
// 添加完成度
    public void addCompleted(int n) {
        completed 
+= n;

        
if (isCompleted()) {
            completed 
= manHour;

            
if (worker != null{
                System.out.println(
"任务"+this+"处理完毕!");
            }

        }

    }


    
public int compareTo(Object obj) {
        Task another 
= (Task) obj;
        
return (another.manHour) - this.manHour;
    }


    
public String toString() {
        
//return "任务名:" + name ;//+ " 工人名:" + worker.getName() + " 完成度:" + completed* 100 / manHour + "%";
        return name;
    }

    
    
public String getCompletedRatio() {
        
return " 完成度:" + completed    * 100 / manHour + "%";
    }


    
public int getCompleted() {
        
return completed;
    }


    
public void setCompleted(int completed) {
        
this.completed = completed;
    }


    
public int getManHour() {
        
return manHour;
    }


    
public void setManHour(int manHour) {
        
this.manHour = manHour;
    }


    
public String getName() {
        
return name;
    }


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


    
public String getId() {
        
return id;
    }


    
public Worker getWorker() {
        
return worker;
    }


    
public void setWorker(Worker worker) {
        
this.worker = worker;
    }


}

package com.sitinspring.autotask.domain;

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

/**
 * 任务库类
 * 
 * 
@author sitinspring
 * 
 
*/

public class TaskLibrary {
    
private List<Task> tasks;
    
private String name;

    
public TaskLibrary(String name) {
        
this.name=name;
        tasks 
= new LinkedList<Task>();
    }


    
// 添加单个任务
    public synchronized void addTask(Task task) {
        tasks.add(task);
        printTasks();
        notifyAll();
    }


    
// 添加多个任务
    public synchronized void addTasks(List<Task> moreTasks) {
        tasks.addAll(moreTasks);
        printTasks();
        notifyAll();
    }

    
    
/**
     * 打印现有任务
     *
     
*/

    
public void printTasks(){
        
if(tasks==null){
            System.out.println(
"无任务");
            
return;
        }

        
        StringBuffer sb
=new StringBuffer();    
        
for(Task task:tasks){
            sb.append(task
+",");
        }

        System.out.println(name
+"现有任务:"+sb.toString());    
    }


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


    
// 工人领受任务
    public synchronized Task fetchTask(Worker worker) {
        
while (tasks.size() == 0{
            
try {
                System.out.println(name
+"中任务告罄");
                System.out.println(name
+"中工人:" + worker.getName() + "进入闲置状态");
                wait();
            }
 catch (InterruptedException ex1) {
                ex1.printStackTrace();
            }

        }


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


    
public String getName() {
        
return name;
    }

}

package com.sitinspring.autotask.domain;

import com.sitinspring.autotask.util.IdUtil;

/**
 * 工人类,用于完成一个”活“
 * 
@author sitinspring
 *
 * @date 2008-2-25
 
*/

public class Worker implements Runnable {
    
/**
     * 工人ID
     
*/

    
private String id;

    
/**
     * 工人名
     
*/

    
private String name;

    
/**
     * 当前任务
     
*/

    
private Task currTask;

    
/**
     * 未完成工件来源的库
     
*/

    
private TaskLibrary srcLib;
    
    
/**
     * 已完成工件去向的库
     
*/

    
private TaskLibrary destLib;

    
// 工作速度
    private int speed;

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


    
// 开始干活
    public void doWork() {
        Thread thread 
= new Thread(this);
        thread.start();
    }


    
// 真正干活
    public void run() {
        
while (true{
            
if (currTask == null || currTask.isCompleted()) {
                
if(currTask != null && currTask.isCompleted()){
                    System.out.println(
"工人:" + name + ""+destLib.getName()+"中放置任务:" + currTask.getName());
                    currTask.setCompleted(
0);
                    destLib.addTask(currTask);                    
                }
                
                
                currTask 
= srcLib.fetchTask(this);
                currTask.setWorker(
this);
            }


            
try {
                Thread.sleep(
1000);// 暂停一秒,模拟现实中的加工过程
                System.out.println("工人"+name+"正在处理任务" + currTask + "完成度"
                        
+ currTask.getCompletedRatio() + ".");
                currTask.addCompleted(speed);
            }
 catch (Exception ex) {
                ex.printStackTrace();
            }

        }

    }


    
public String getName() {
        
return name;
    }


    
public void setName(String name) {
        
this.name&nbs