• Java并发练习


    1.按顺序打印ABC

         三个线程,每个线程分别打印A,B,C各十次,现在要求按顺序输出A,B,C

    package concurrency;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class 按顺序打印ABC {
    
        public static void main(String[] args) {
            ExecutorService threadPool = Executors.newFixedThreadPool(3);
            Object lockA = new Object();
            Object lockB = new Object();
            Object lockC = new Object();
            Runnable rA = new OrderPrintABC(lockC, lockA, "A");
            Runnable rB = new OrderPrintABC(lockA, lockB, "B");
            Runnable rC = new OrderPrintABC(lockB, lockC, "C");
            threadPool.execute(rA);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            threadPool.execute(rB);
            threadPool.execute(rC);
            threadPool.shutdown();
        }
        
        private static class OrderPrintABC implements Runnable{
    
            private Object preLock;
            private Object selfLock;
            private String taskName;
            private int count = 10;
            
            public OrderPrintABC(Object preLock, Object selfLock, String taskName) {
                this.preLock = preLock;
                this.selfLock = selfLock;
                this.taskName = taskName;
            }
            
            @Override
            public void run() {
                while(count > 0) {
                    synchronized(preLock) {
                        synchronized(selfLock) {
                            System.out.print(taskName);
                            count--;
                            selfLock.notifyAll();
                        }
                        if(count > 0) {
                            try {
                                preLock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
    }
    }

    2. 生产者消费者: 要尽量使用BlockingQueue来实现

    https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md#blockingqueue

    package concurrency;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class 生产者消费者 {
    
        //有界队列
        private static class BoundQueue<T> {
            private Object[] items;
            private int count = 0;
            private Lock lock = new ReentrantLock();
            private Condition notEmpty = lock.newCondition();
            private Condition notFull = lock.newCondition();
            
            public BoundQueue(int size) {
                items = new Object[size];
            }
            
            public void add(T t) throws InterruptedException {
                lock.lock();
                try {
                    Long nano = 0L;
                    while (count == items.length) {
                        if(nano < 0L) {
                            return;
                        };
                        System.out.println("仓库已满");
                        notFull.awaitNanos(5000);
                    }
                    items[count++] = t;
                    System.out.println("生产者放入" + t);
                    notEmpty.signal();
                    Thread.sleep(1000);
                } finally {
                    lock.unlock();
                }
            }
            
            public T remove() throws InterruptedException {
                lock.lock();
                T t;
                try {
                    Long nano = 0L;
                    while (count == 0) {
                        if(nano < 0L) {
                            return null;
                        };
                        System.out.println("仓库已空");
                        nano = notEmpty.awaitNanos(5000);
                    }
                    t = (T) items[count - 1];
                    items[--count] = null;
                    System.out.println("消费者接收" + t);
                    notFull.signal();
                    Thread.sleep(1000);
                } finally {
                    lock.unlock();
                }
                return t;
            }
        }
        
        //生产者
        private static class Product implements Runnable{
            private BoundQueue queue;
            private int count;
            
            public Product (BoundQueue queue, int count) {
                this.queue = queue;
                this.count = count;
            }
            
            public void run() {
                int itr = 1;
                while(itr <= count) {
                    try {
                        queue.add(itr);
                        itr++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        //消费者
        private static class Consumer implements Runnable{
            private BoundQueue queue;
            private int count;
            
            public Consumer(BoundQueue queue, int count) {
                this.queue = queue;
                this.count = count;
            }
    
            @Override
            public void run() {
                int itr = 0;
                while(itr <= count) {
                    try {
                        queue.remove();
                        itr++;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            BoundQueue<Integer> queue = new BoundQueue<>(5);
            int count = 6;
            Runnable rP = new Product(queue, count);
            Runnable rC = new Consumer(queue, count);
            ExecutorService threadPool = Executors.newFixedThreadPool(2);
            threadPool.execute(rP);
            threadPool.execute(rC);
            threadPool.shutdown();
        }
    }

    https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md#blockingqueue

  • 相关阅读:
    判断语句和循环语句2.2比较运算符
    判断语句和循环语句2.5 if中使用else
    判断语句和循环语句2.1 True、False
    判断语句和循环语句2.9while循环
    判断语句和循环语句2.7 if嵌套
    判断语句和循环语句2.8应用:猜拳游戏
    判断语句和循环语句逻辑运算符
    K8S 搭建 Prometheus (一) 部署 nodeexporter, prometheusserver
    使用Hive运行Job程序报GC错误
    离线数仓(四)
  • 原文地址:https://www.cnblogs.com/heyboom/p/11190590.html
Copyright © 2020-2023  润新知