美文网首页
Concurrency (二) prac2

Concurrency (二) prac2

作者: lhsjohn | 来源:发表于2019-03-03 23:21 被阅读0次
    2018-09-26.jpg

    今天主要记录下两个比较有意思的应用实例

    1 吐司BlockingQueue

    一台机器具有三个任务,一个是制作吐司、一个给吐司涂抹黄油、另一个在摸过黄油的吐司上涂抹果酱。我们可以通过各个处理过程之间的blockingQueue来运行这个吐司制作程序。

    //: concurrency/ToastOMatic.java
    // A toaster that uses queues.
    package com.lhsjohn.comcurrency.prac;
    
    import java.util.concurrent.*;
    import java.util.*;
    
    class Toast {
        public enum Status {
            DRY, BUTTERED, JAMMED
        }
    
        private Status status = Status.DRY;
        private final int id;
    
        public Toast(int idn) {
            id = idn;
        }
    
        public void butter() {
            status = Status.BUTTERED;
        }
    
        public void jam() {
            status = Status.JAMMED;
        }
    
        public Status getStatus() {
            return status;
        }
    
        public int getId() {
            return id;
        }
    
        public String toString() {
            return "Toast " + id + ": " + status;
        }
    }
    
    class ToastQueue extends LinkedBlockingQueue<Toast> {
    }
    
    class Toaster implements Runnable {
        private ToastQueue toastQueue;
        private int count = 0;
        private Random rand = new Random(47);
    
        public Toaster(ToastQueue tq) {
            toastQueue = tq;
        }
    
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    TimeUnit.MILLISECONDS.sleep(100 + rand.nextInt(500));
                    // Make toast
                    Toast t = new Toast(count++);
                    System.out.println(t);
                    // Insert into queue
                    toastQueue.put(t);
                }
            } catch (InterruptedException e) {
                System.out.println("Toaster interrupted");
            }
            System.out.println("Toaster off");
        }
    }
    
    // Apply butter to toast:
    class Butterer implements Runnable {
        private ToastQueue dryQueue, butteredQueue;
    
        public Butterer(ToastQueue dry, ToastQueue buttered) {
            dryQueue = dry;
            butteredQueue = buttered;
        }
    
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    // Blocks until next piece of toast is available:
                    Toast t = dryQueue.take();
                    t.butter();
                    System.out.println(t);
                    butteredQueue.put(t);
                }
            } catch (InterruptedException e) {
                System.out.println("Butterer interrupted");
            }
            System.out.println("Butterer off");
        }
    }
    
    // Apply jam to buttered toast:
    class Jammer implements Runnable {
        private ToastQueue butteredQueue, finishedQueue;
    
        public Jammer(ToastQueue buttered, ToastQueue finished) {
            butteredQueue = buttered;
            finishedQueue = finished;
        }
    
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    // Blocks until next piece of toast is available:
                    Toast t = butteredQueue.take();
                    t.jam();
                    System.out.println(t);
                    finishedQueue.put(t);
                }
            } catch (InterruptedException e) {
                System.out.println("Jammer interrupted");
            }
            System.out.println("Jammer off");
        }
    }
    
    // Consume the toast:
    class Eater implements Runnable {
        private ToastQueue finishedQueue;
        private int counter = 0;
    
        public Eater(ToastQueue finished) {
            finishedQueue = finished;
        }
    
        public void run() {
            try {
                while (!Thread.interrupted()) {
                    // Blocks until next piece of toast is available:
                    Toast t = finishedQueue.take();
                    // Verify that the toast is coming in order,
                    // and that all pieces are getting jammed:
                    if (t.getId() != counter++ || t.getStatus() != Toast.Status.JAMMED) {
                        System.out.println(">>>> Error: " + t);
                        System.exit(1);
                    } else
                        System.out.println("Chomp! " + t);
                }
            } catch (InterruptedException e) {
                System.out.println("Eater interrupted");
            }
            System.out.println("Eater off");
        }
    }
    
    public class ToastOMatic {
        public static void main(String[] args) throws Exception {
            ToastQueue dryQueue = new ToastQueue(), butteredQueue = new ToastQueue(), finishedQueue = new ToastQueue();
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(new Toaster(dryQueue));
            exec.execute(new Butterer(dryQueue, butteredQueue));
            exec.execute(new Jammer(butteredQueue, finishedQueue));
            exec.execute(new Eater(finishedQueue));
            TimeUnit.SECONDS.sleep(5);
            exec.shutdownNow();
        }
    } /* (Execute to see output) */// :~
    
    
    
    

    运行结果:

    
    Toast 1: DRY
    Toast 2: DRY
    Toast 3: DRY
    Toast 4: DRY
    Toast 5: DRY
    Toast 6: DRY
    Toast 7: DRY
    Toast 8: DRY
    Toast 9: DRY
    Toast 10: DRY
    Toast 11: DRY
    Toast 12: DRY
    Eater interrupted
    Eater off
    Toaster interrupted
    Toaster off
    Jammer interrupted
    Jammer off
    
    
    
    

    2.仿真之赛马

    package com.lhsjohn.comcurrency.prac;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    
    class Horse implements Runnable {
      private static int counter = 0;
      private final int id = counter++;
      private int strides = 0;
      private static Random rand = new Random(47);
      private static CyclicBarrier barrier;
      public Horse(CyclicBarrier b) { barrier = b; }
      public synchronized int getStrides() { return strides; }
      public void run() {
        try {
          while(!Thread.interrupted()) {
            synchronized(this) {
              strides += rand.nextInt(3); // Produces 0, 1 or 2
            }
            barrier.await();
          }
        } catch(InterruptedException e) {
          // A legitimate way to exit
        } catch(BrokenBarrierException e) {
          // This one we want to know about
          throw new RuntimeException(e);
        }
      }
      public String toString() { return "Horse " + id + " "; }
      public String tracks() {
        StringBuilder s = new StringBuilder();
        for(int i = 0; i < getStrides(); i++)
          s.append("*");
        s.append(id);
        return s.toString();
      }
    }
    
    public class HorseRace {
      static final int FINISH_LINE = 75;
      private List<Horse> horses = new ArrayList<Horse>();
      private ExecutorService exec =
        Executors.newCachedThreadPool();
      private CyclicBarrier barrier;
      public HorseRace(int nHorses, final int pause) {
        barrier = new CyclicBarrier(nHorses, new Runnable() {
          public void run() {
            StringBuilder s = new StringBuilder();
            for(int i = 0; i < FINISH_LINE; i++)
              s.append("="); // The fence on the racetrack
            System.out.println(s);
            for(Horse horse : horses)
                System.out.println(horse.tracks());
            for(Horse horse : horses)
              if(horse.getStrides() >= FINISH_LINE) {
                  System.out.println(horse + "won!");
                exec.shutdownNow();
                return;
              }
            try {
              TimeUnit.MILLISECONDS.sleep(pause);
            } catch(InterruptedException e) {
                System.out.println("barrier-action sleep interrupted");
            }
          }
        });
        for(int i = 0; i < nHorses; i++) {
          Horse horse = new Horse(barrier);
          horses.add(horse);
          exec.execute(horse);
        }
      }
      public static void main(String[] args) {
        int nHorses = 5;
        int pause = 200;
        if(args.length > 0) { // Optional argument
          int n = new Integer(args[0]);
          nHorses = n > 0 ? n : nHorses;
        }
        if(args.length > 1) { // Optional argument
          int p = new Integer(args[1]);
          pause = p > -1 ? p : pause;
        }
        new HorseRace(nHorses, pause);
      }
    } /* (Execute to see output) *///:~
    
    
    

    运行结果: 看成是动态的👀

    ************************************************************************1
    *************************************************************************2
    **************************************************3
    ******************************************4
    ===========================================================================
    ***************************************************0
    **************************************************************************1
    *************************************************************************2
    ****************************************************3
    ******************************************4
    ===========================================================================
    ***************************************************0
    ****************************************************************************1
    *************************************************************************2
    ******************************************************3
    *******************************************4
    Horse 1 won!
    
    
    
    

    作者:lhsjohn

    相关文章

      网友评论

          本文标题:Concurrency (二) prac2

          本文链接:https://www.haomeiwen.com/subject/hzevuqtx.html