• 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();
        }
    }
  • 相关阅读:
    体温登记APP总结
    体温登记day4
    体温登记day3
    寒期周总结五
    体温登记day2
    体温登记day1
    家庭记账本day7
    家庭记账本day6
    家庭记账本day5
    家庭记账本day4
  • 原文地址:https://www.cnblogs.com/zheaven/p/12172163.html
Copyright © 2020-2023  润新知