Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2020, 16:00   #1
OLE_EVE
Новичок
Джуниор
 
Регистрация: 30.09.2020
Сообщений: 1
По умолчанию JAVA

Здравствуйте уважаемые!
Помогите, пожалуйста, понять.
Имеется код:
Код:
package pr1;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;

public class FourMillions {


  /**
   * Класс-счётчик.
   */
  static class Counter {

    /**
     * Буфер счёта
     */
    private long count = 0;

    /**
     * Считаем +1
     */
    public void increment() {
      count++;
    }

    /**
     * Получить текущее значение счётчика
     */
    public long getCount() {
      return count;
    }
  }

  private final static int N_THREADS = 4;

  /**
   * Точка входа в программу
   *
   * @param args арг-ты командной строки
   */
  public static void main(String[] args) {
    Counter counter = new Counter();

    ExecutorService executorService = Executors.newFixedThreadPool(N_THREADS);

    // создаём java.Util.Stream для интов щт 0 до 4 (искд.)
    // * не путать Stream и Thread
    CompletableFuture<?>[] futures = IntStream.range(0, N_THREADS)
        // вместо каждой цифры запускаем инкременты счётчика
       
    		 .mapToObj(ignored -> runCounting(counter, executorService))
        // собираем CompletableFuture'ы в масси
        .toArray(CompletableFuture[]::new);

    ///System.out.println("Total count: " + counter.getCount());
    
    // когда все потоки завершат свою работу
    CompletableFuture.allOf(futures).thenRun(() -> {
      // имеем шанс не получить 4 млн
    	//System.out.println("Total count: " + counter.getCount());
        executorService.shutdown();
    });
  }

  /**
   * Запускает миллион инкрементов счётчика в отдельном потоке
   *
   * @param counter         счётчик для инкрементов
   * @param executorService пул потоков для работы
   *
   * @return CompletableFuture без результата, разрешаемый после завершения инкрементаций
   */
  
  
  private static CompletableFuture<?> runCounting(Counter counter, ExecutorService executorService) {
    
	
	  
	  return CompletableFuture.runAsync(
		        () -> {
		          for (int j = 0; j < 1000000; j++) {
		            counter.increment();
		           
		          }
		                    
		          
		        },
		        executorService
		    );

       
  }
}
Суть проблемы в том, что результат не доходит до 4 млн. Я использовала Thread.sleep перед for или в цикле использовала count и это давало нужный результат, но мне сказали, что есть другое решение, более быстрое, настолько, что я не могу догнать. Прошу направить на путь истины. Заранее спасибо!
OLE_EVE вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение кучи java.lang.OutOfMemoryError: Java heap space Karik_ Java Базы данных (JDBC, JPA, Hibernate) 4 09.03.2017 12:04
Помогите справиться с java.lang.OutOfMemoryError: Java heap space Levilaulada Помощь студентам 1 17.05.2009 10:59