package Samplesthread;

import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Counterr {

    Map<String, Integer> mySite = new LinkedHashMap<String, Integer>();
    Random rand = new Random();//рандомные значения

    private static AtomicInteger threadCount = new AtomicInteger(0); //счетчик потоков

    public void execute() throws InterruptedException {//выполнение

        int numberAll = 10; //всего может быть потоков одновременно
        for (int i = 0; i < 50; i++) {
            threadCount.incrementAndGet();//увеличиваем счетчик++
        }
        System.out.println("threadCount (before) = " + threadCount.get());//счётчик до выполнения


        for (int i = 1; i <= numberAll; i++) {
            mySite.put("http://mysite.ru/page".concat(Integer.toString(i)),0);//заполняет string
        }


        long start = System.currentTimeMillis();//миллисекунды ожидания от старта
        String[] url = new String[5];
        for (int i = 0; i < 50; i++) {
            for (int k=0;k<5;k++){
                url[k] = "http://mysite.ru/page".concat(Integer.toString(rand.nextInt(numberAll)+1));
            }
            User visitor = new User(url);//объявление нового потока
            new Thread(visitor).start();//старт потока
            Thread.sleep(10);//приостанавливает работу текущего потока на заданное время

        }
        System.out.println("-------------------------");
        System.out.println("Finished in " + (System.currentTimeMillis() - start) + " mls");//вывод времени окончания
        System.out.println("-------------------------");
        Thread.sleep(200);//блокирует на заданное время


        //вывод на экран страниц с частотой их посещения
        int counterAll = 0;
        for (Map.Entry<String, Integer> entry : mySite.entrySet()) {
            System.out.println("Страница сайта: "+entry.getKey()+"  ; Количество посещений: "+entry.getValue());
            counterAll = counterAll + entry.getValue();
        }
        Thread.sleep(500);
        System.out.println("-------------------------");
        Thread.sleep(500);
        System.out.println("Всего посещений сайта: ".concat(Integer.toString(counterAll)));//всего операций
        System.out.println("threadCount (after) = " + threadCount.get());//насколько хорошо посчитал наш decrement
    }

    private class User implements Runnable {

        private String[] url;
        public User(String[] url) {
            this.url = url;
        }

        @Override
        public void run() {
            for (int i=1;i<=10;i++){
                for (int j=0;j<5;j++){
                    synchronized (mySite.get(url[j])) {//синхронизированное выполнение функции
                        mySite.put(url[j], mySite.get(url[j]) + 1);
                        Thread.yield();
                    }
                }
            }
            threadCount.decrementAndGet();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new Counterr().execute();
    }
}