• Work Thread Design Pattern


    模拟传送带工作模式

    Channel 传送带

    package com.dwz.concurrency2.chapter18;
    
    import java.util.Arrays;
    /**
     *    传送带
     */
    public class Channel {
        private final static int MAX_REQUEST = 100;
        
        private final Request[] requestQueue;
        
        private int head;
        
        private int tail;
        
        private int count;
        
        private final WorkerThread[]  workerPool;
        
        public Channel(int workers) {
            this.requestQueue = new Request[MAX_REQUEST];
            this.head = 0;
            this.tail = 0;
            this.count = 0;
            this.workerPool = new WorkerThread[workers];
            this.init();
        }
    
        private void init() {
            for(int i = 0; i < workerPool.length; i++) {
                workerPool[i] = new WorkerThread("Worker-" + i, this);
            }
        }
        
        /**
         * push switch to start all of worker to work.
         */
        public void startWorker() {
            Arrays.asList(workerPool).forEach(WorkerThread::start);
        }
        
        public synchronized void put(Request request) {
            while (count >= requestQueue.length) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
            this.requestQueue[tail] = request;
            this.tail = (tail + 1) % this.requestQueue.length;
            this.count++;
            this.notifyAll();
        }
        
        public synchronized Request take() {
            while (count <= 0) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            
            Request request = this.requestQueue[head];
            this.head = (this.head + 1) % this.requestQueue.length;
            this.count--;
            this.notifyAll();
            return request;
        }
    }

    Request 商品

    package com.dwz.concurrency2.chapter18;
    /**
     * 商品
     */
    public class Request {
        private final String name;
        private final int number;
        
        public Request(String name, int number) {
            this.name = name;
            this.number = number;
        }
        
        public void execute() {
            System.out.println(Thread.currentThread().getName() + " executed " + this);
        }
        
        @Override
        public String toString() {
            return "Request=> No." + number + ", Name=>" + name;
        }
        
    }

    TransportThread 向传送带上搬运线程

    package com.dwz.concurrency2.chapter18;
    
    import java.util.Random;
    /**
     * 向传送带上搬运
     */
    public class TransportThread extends Thread {
        private final Channel channel;
        
        private static final Random random = new Random(System.currentTimeMillis());
    
        public TransportThread(String name, Channel channel) {
            super(name);
            this.channel = channel;
        }
        
        @Override
        public void run() {
            try {
                for(int i = 0; true; i++) {
                    Request request = new Request(getName(), i);
                    this.channel.put(request);
                    Thread.sleep(random.nextInt(1000));
                }
            } catch (Exception e) {
            }
        }
    }

    WorkerThread 从传送带上带走的线程

    package com.dwz.concurrency2.chapter18;
    
    import java.util.Random;
    /**
     *    从传送带上带走
     */
    public class WorkerThread extends Thread {
        private final Channel channel;
        
        private static final Random random = new Random(System.currentTimeMillis());
        
        public WorkerThread(String name, Channel channel) {
            super(name);
            this.channel = channel;
        }
        
        @Override
        public void run() {
            while (true) {
                channel.take().execute();
                try {
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    测试

    package com.dwz.concurrency2.chapter18;
    
    public class WorkerClient {
        public static void main(String[] args) {
            Channel channel = new Channel(5);
            channel.startWorker();
            
            new TransportThread("Alex", channel).start();
            new TransportThread("Jack", channel).start();
            new TransportThread("William", channel).start();
        }
    }
  • 相关阅读:
    CSS 3列等高
    CSS分列等高
    jQuery函数
    JQuery解析JSON数据
    2020-09-25:rust中Point是结构体类型,【let p1=Point{x:25,y:25};let p2=p1;】请问p1和p2是同一个对象吗?
    2020-09-24:jvm监控系统是通过jmx做的么?
    2020-09-23:TCP头部信息有哪些?
    2020-09-22:已知两个数的最大公约数和最小公倍数,并且这两个数不能是最大公约数和最小公倍数本身。如何判断这两个数是否存在?
    2020-09-21:已知最大公约数和最小公倍数,如何判断这两个数是否存在?
    2020-09-20:如何判断一个数是质数?
  • 原文地址:https://www.cnblogs.com/zheaven/p/12172163.html
Copyright © 2020-2023  润新知