zoukankan      html  css  js  c++  java
  • java多线程之计算数量

    package Thread.Abort;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    
    //计数类
    class Count {//DATA
        private int count = 0;
        private Random rand = new Random(47);
    
        //
        public synchronized int increment() {
            int temp = count;
            if (rand.nextBoolean())
                Thread.yield();
            return (count = ++temp);
        }
    
        public synchronized int value() {
            return count;
        }
    }
    
    //动作类
    class Entrance implements Runnable {
        private static Count count = new Count();
        private static List<Entrance> entrances = new ArrayList<Entrance>();
        private int number = 0;
        private final int id;
        private static volatile boolean canceled = false;
    
        public static void cancel() {
            canceled = true;
        }
    
        public Entrance(int id) {
            this.id = id;
            entrances.add(this);
        }
    
        @Override
        public void run() {
            while (!canceled) {
                synchronized (this) {
                    ++number;
                }
                System.out.println(this + " Total:" + count.increment());//要显示的数值都要通过同步方法读取才准确
                try {
                    TimeUnit.MICROSECONDS.sleep(100);
                } catch (Exception e) {
                    System.out.println("sleep interrupted");
                }
            }
            System.out.println("Stopping " + this);
        }
    
        public synchronized int getValue() {
            return number;
        }
    
        public String toString() {
            return "Entrance " + id + ": " + getValue();
        }
    
        public static int getTotalCount() {
            return count.value();
        }
    
        public static int sumEntrances() {
            int sum = 0;
            for (Entrance entrance : entrances) {
                sum += entrance.getValue();
            }
            return sum;
        }
    }
    
    public class OrnamentalGarden {
        public static void main(String[] args) throws InterruptedException {
            ExecutorService exec = Executors.newCachedThreadPool();
            for (int i = 0; i < 5; i++) {
                exec.execute(new Entrance(i));
            }
            TimeUnit.SECONDS.sleep(3);
            Entrance.cancel();
            exec.shutdown();
            if (!exec.awaitTermination(250, TimeUnit.MILLISECONDS))
                System.out.println("Some tasks were not terminated!");
            System.out.println("Total:" + Entrance.getTotalCount());
            System.out.println("Sum of Entrances:" + Entrance.sumEntrances());
        }
    }
  • 相关阅读:
    移动端rem布局的适配mixin【转藏】
    移动端布局Demo展示图文
    百思不得其解—这些年做Web开发遇到的坑?
    elemetnui 分页..解决 bug
    linq.js
    yalinqo 的使用...
    vue 利用 v-model 实现 双向传递数据..
    Mui 选项卡 tab 高度 没有自适应....
    css flex 使内容 水平居中 的方法...
    IDEA 在 专注模式下 显示 行号 和 缩进线...
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3755946.html
Copyright © 2011-2022 走看看