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());
        }
    }
  • 相关阅读:
    jquery 获取各种屏幕的宽度和高度
    我相信 Kenny
    C# 预览和打印出来的位置不符的问题 Kenny
    地址,数据位的一些理解:战舰板子
    OLED显示并口方式:
    __attribute__机制介绍
    大端模式 & 小端模式
    OV7670:
    STM32 Program Size: Code=29578 ROdata=4010 RWdata=488 ZIdata=1856
    DS18B20实验:神舟IV
  • 原文地址:https://www.cnblogs.com/zhuawang/p/3755946.html
Copyright © 2011-2022 走看看