zoukankan      html  css  js  c++  java
  • Worker Thread等到工作来,来了就工作

    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();
            }
        }
    }
  • 相关阅读:
    layui弹出层处理(获取、操作弹出层数据等)
    Unity3D判断鼠标向右或向左滑动,响应不同的事件
    (转载)李剑英的CSLight入门指南结合NGUI热更新
    Unity3D研究院之LZMA压缩文件与解压文件
    CSLight研究院之学习笔记结合NGUI(一)
    《暗黑世界GM管理后台系统》部署+功能说明文档
    Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
    电信SDK Pay函数里面System.out.print 无输出消息
    WP8:在Unity中使用OpenXLive
    WP8:Unity3D之间的值传递
  • 原文地址:https://www.cnblogs.com/gaotianle/p/3308010.html
Copyright © 2011-2022 走看看