Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] JAVA и системы массового обслуживания, система массового обслуживания  
:(
    Опции темы
Atum
Дата 4.5.2012, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Всем добрый день ! 

Требуется реализовать макет  Систему массового обслуживания  на Java - со следующей логикой !

В Систему поступает поток  заявок .

Требуется реализовать логику и создать пул для обработки заявок: 

1.создать очередь на параллельную обработку 10 заявок (Это pool)  из воркеров которые всегда работают .

2. время обработки каждой заявки воркером -  не более T(обр) = 2 секунд. 
(если это время превышено - то такая заявка прекращает выполниться и исполняемый автомат освобождается )!

3. если заявка пришла  и все автоматы заняты -  она ждет T(oжид) = 3 секунды , и если все автоматы  заняты - эта заявка уходит из очереди .

Как такое запрограммировать? 

Это сообщение отредактировал(а) Atum - 4.5.2012, 17:16
PM MAIL   Вверх
jk1
Дата 4.5.2012, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 75



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
IBS
Дата 4.5.2012, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: нет
Всего: 6



Цитата(Atum @  4.5.2012,  17:05 Найти цитируемый пост)
Как такое запрограммировать? 

Поконкретнее. Что непонятно?
PM MAIL   Вверх
Atum
Дата 5.5.2012, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Цитата(IBS @ 4.5.2012,  19:44)
Цитата(Atum @  4.5.2012,  17:05 Найти цитируемый пост)
Как такое запрограммировать? 

Поконкретнее. Что непонятно?


1.создать очередь на параллельную обработку 10 заявок (Это pool)  из воркеров которые всегда работают .

2. время обработки каждой заявки воркером -  не более T(обр) = 2 секунд. 
(если это время превышено - то такая заявка прекращает выполниться и исполняемый автомат освобождается )!

3. если заявка пришла  и все автоматы заняты -  она ждет T(oжид) = 3 секунды , и если все автоматы  заняты - эта заявка уходит из очереди .

что непонятно : 

1.как организовать стек бесконечной очереди с ожиданием ! 
2.обработчик этой очереди из 10 параллельно работающих каналов (воркеров)!


желательно пример (код)


PM MAIL   Вверх
IBS
Дата 5.5.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: нет
Всего: 6



Вкратце алгоритм будет выглядеть так:
1) генерируем произвольной число заявок(в разумных пределах) и задаем время необходимое на их обработку
2) передаем это значение на объект управления
3) В объекте управления проверяем освободились ли кассы
4) Проверяем не пора ли кого убрать из очереди.
5) отправляем элементы из очереди в кассы(если есть, если возможно)
6) работаем с пришедшими заявками(пытаемся пихнуть на кассы, если нет - суем в очередь и приписываем им тек. момент)
7) идем к шагу 1

По объектам:
-Каждая касса хранит значение времени когда она освободится и флаг(определяем свободна или нет)
-при каждом входе в объект управления пытаемся освободить кассы(если текущее время >= времени освобождения, то переставляем флаг)

Код писать нет времени, да и  Java я знаю только на уровне базового синтаксиса. Все что могу здесь еще посоветовать - это не пишите все это "в лоб". Тут сначала нужно сесть и спроектировать модель. (все необходимы классы, их поля, методы)
PM MAIL   Вверх
Atum
Дата 5.5.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 3.10.2008

Репутация: нет
Всего: нет



Что есть : 

класс список - который удаляет первый элемент из себя автоматом если он пролежал в нем больше 2-х секунд.

UPD ! ввел переменную removeCount  изменил сигнатуру  run() но все равно не тот эффект !

что не так !  я хочу чтобы удалялись все элементы которые я добавил две секунды назад! 
т.е. их надо как то метить и  по истечении срока годности удалять все сразу ! 

Плюс нет синхронизации :(  при удалении и добавлении элементов (добавлять элементы могу  многие потоки)

к функции  removeFirst() как раз и обращаются  воркеры, когда один из них становится свободным .


Код



import java.util.LinkedList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class ScheduledLinkedList<T> extends LinkedList<T> implements Runnable{
      ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
      static long removeCount = 0;
      
      public void scheduledRemove() {
        
        removeCount = this.size();
        
        System.out.println("***   "+ this.size()+"   ***");
        System.out.println(""+this);
        service.scheduleAtFixedRate(this, 0, 2, TimeUnit.SECONDS);
    }

    @Override
   synchronized  public T removeFirst() {
        if(removeCount>0)removeCount--;
         return super.removeFirst();
    }

      
      
    @Override
    public void run() {
        long count = removeCount;
        System.out.println("["+this.size() +" - "+count + " = " + (this.size() - count)+"] : "  + this) ;
         System.err.print("Ушли : [");
        for (long i = 0; i < count; i++) {
            System.err.print(" " + removeFirst());
        }
         System.err.println("]");
        removeCount = this.size();
    }
}



Код

    public static void main(String[] args) throws InterruptedException {
        // TODO code application logic here
        

        final ScheduledLinkedList<String> list = new ScheduledLinkedList<String>();
        for (int i = 0; i < 10; i++) {
            list.add("" + i);

        }
        list.scheduledRemove();
        
         ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
         
          service.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.err.println("Обсдужил : [ " + list.removeFirst() + " " + list.removeFirst() + " " + list.removeFirst()+" " + list.removeFirst() + " ]");
                 System.out.println("Ожидают  : ("+list.size()+") " + list);
            }
        }, 1, 1, TimeUnit.SECONDS);
        
        while (true) {
            long sleep = Math.round(Math.random() * 1000);
            long count = Math.round(Math.random() * 10)+1;
            for (int i = 1; i < count+1; i++) {
                list.add(count + "a" + i);
            }
            System.out.println("add : "+count+  " sleep : " + sleep + " ms" );
            Thread.sleep(sleep);

            
            
        }

    }


Это сообщение отредактировал(а) Atum - 5.5.2012, 17:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.