Worker Thread等到工作来,来了就工作

来源:互联网 发布:什么是淘宝首页流量 编辑:程序博客网 时间:2024/04/29 20:01

Worker是“工人”的意思,worker thread pattern中,工人线程(worker thread)会一次抓一件工作来处理,当没有工作可做时,工人线程会停下来等待心得工作过来。

Worker Thread也叫做background thread,另外,也有人把视点放在管理工人线程的地方,称之为Thread Pool。

 

复制代码
public class WorkerThreadTest {    /**     * @param args     */    public static void main(String[] args) {        Channel channel = new Channel(5);        channel.startWorkers();        new WorkerClientThread("Alice", channel).start();        new WorkerClientThread("Bobby", channel).start();        new WorkerClientThread("Chris", channel).start();    }}class WorkerClientThread extends Thread{    private final Channel channel;    private static final Random random = new Random();    public WorkerClientThread(String name,Channel channel){        super(name);                this.channel=channel;    }    @Override    public void run() {        try{            for(int i=0;true; i++){                WorkerRequest request = new WorkerRequest(getName(),i);                channel.put(request);                Thread.sleep(random.nextInt(1000));            }        }catch(InterruptedException e){            e.printStackTrace();        }    }}class WorkerRequest{    private final String name;    private final int number;    private static final Random random = new Random();        public WorkerRequest(String name,int number){        this.name=name;        this.number=number;    }        public void execute(){        System.out.println(Thread.currentThread().getName() + " executes " + this);                try {            Thread.sleep(random.nextInt(1000));        } catch (InterruptedException e) {            e.printStackTrace();        }    }    @Override    public String toString() {        return "[Request from " + name + " No." + number + "]";    }}class Channel{    private static final int MAX_REQUEST=100;    private final WorkerRequest[] requestQueue;    private int tail;    private int head;    private int count;        private final WorkerThread[] threadPool;        public Channel(int threads){        this.requestQueue=new WorkerRequest[MAX_REQUEST];        this.head = 0;        this.tail=0;        this.count=0;                threadPool=new WorkerThread[threads];                for(int i=0;i < threadPool.length;i++){            threadPool[i] = new WorkerThread("Worker-" + i, this);        }    }        public void startWorkers(){        for(int i=0;i<threadPool.length;i++){            threadPool[i].start();        }    }        public synchronized void put(WorkerRequest request){        while(count>=requestQueue.length){            try {                wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }                requestQueue[tail]=request;        tail=(tail+1)%requestQueue.length;        count++;        notify();    }        public synchronized WorkerRequest take(){        while(count<=0){            try {                wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }                WorkerRequest request = requestQueue[head];                head=(head+1)%requestQueue.length;        count--;        notify();        return request;    }}class WorkerThread extends Thread{    private final Channel channel;    public WorkerThread(String name, Channel channel){        super(name);        this.channel=channel;    }    @Override    public void run() {        while(true){            WorkerRequest request = channel.take();            request.execute();        }    }}
0 0
原创粉丝点击