Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа "симулятор обменки" с потоками / 13 сообщений из 13, страница 1 из 1
14.01.2016, 23:33
    #39147814
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Ребят помогите, вот такое задание: Создать программу "Симулятор обменки". Программа позволяет обслуживать до 5 человек одновременно. Каждый человек (отдельный поток) раз в определенное количество времени (для каждого потока оно разное, задать константой) будет покупать или продавать случайное
количество валюты. Раз в N времени бухгалтер (еще один поток), выводит отчет о доходе обменки за прошедшее время (доход = разница между текущем количеством гривны и количеством гривны N времени назад + разница между текущем количеством валюты и количеством валюты N
времени назад в гривневом эквиваленте по курсу покупки валюты). Как только гривны (или доллара) станет меньше чем потребуется для операции - все валютные операции прекращаются. Бухгалтер фиксирует прибыль и выводит отчет (итоговую прибыль).

Не могу понять как сделать покупателей в цикле, и связать их с обьектами потока, вот начал реализацию:

public class ObmenkaPotoki {

static int hrn = 100000;
static int usd = 10000;

public static void main(String[] args) throws InterruptedException {

long timeD = System.currentTimeMillis();


Thread men = new Peoples();
men.start();


Thread men2 = new Peoples();
men2.start();



Thread men3 = new Peoples();
men3.start();



Thread men4 = new Peoples();
men4.start();



Thread men5 = new Peoples();
men5.start();


long timeU = System.currentTimeMillis();

Thread buhgalter = new Buhgalter();
buhgalter.start();









}

static class Peoples extends Thread {
@Override
public void run() {
try {
Peoples.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}



}

}

static class Buhgalter extends Thread{
@Override
public void run() {
super.run();
}
}







}
...
Рейтинг: 0 / 0
15.01.2016, 11:18
    #39148061
Valentin Kolesnikov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Azarnoy,

Может быть библиотека RxJava подойдёт для этой задачи.

С уважением, Валентин
...
Рейтинг: 0 / 0
15.01.2016, 11:18
    #39148062
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
IMHO Определится какие у Вас есть классы:

People ( "s" на конце на мой взгляд излишне))) ) - имитация человека
Buhgalter - поток выводящий/забирающий отчет в заданный интервал времени
ChangeOffice - кто собственно будет выполнять обмен

Операции/методы, которые должны выполняться в ChangeOffice:

bay_baks
sell_baks
get_report

Создать объект ChangeOffice, передать его в экземпляры People, Buhgalter. В экземплярах People и Buhgalter соответственное поле для хранения ChangeOffice. Можно конечно и singleton использовать (не факт, что ChangeOffice может быть только один)

У ChangeOffice данные методы должны быть объявлены synchronized.

Реализация People и Buhgalter простая как три копейки:

У People
Код: java
1.
2.
3.
4.
5.
6.
while ( ! interrupted ) {
   sleep(...);
   chage_office.bay_baks( ... );
   sleep(...);
   chage_office.sell_baks( ... );
}


Аналогично у бухгалтера:
Код: java
1.
2.
3.
4.
5.
while ( ! interrupted ) {
   sleep(...);
   String report = chage_office.get_report( ... );
   System.out.println( report );
}





Как только гривны (или доллара) станет меньше чем потребуется для операции - все валютные операции прекращаются. ...фиксирует прибыль и выводит отчет (итоговую прибыль).

Нужен какой-то флаг, который будем ждать в основной программе. Например, в основной программе:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
ChangeOffice changeOffice = new ....

men1 = new People( changeOffice );
men2 = new People( changeOffice );
....Создали и запустили людей и бухгалтера....

changeOffice.wait();
String report = changeOffice.get_report( ... );
System.out.println( "Finish report: " + report );



В методах ChangeOffice bay_baks, sell_baks
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// Проверяем, что офис открыт
if ( this.is_closed ) {
  return;  // или Exception. Пошли нафиг, рабочий день кончился
}
// Логика покупки/продажи валюты
...
// когда определили, что операции больше не доступны
if ( обанкротились ) {
  this.is_closed = true;
  changeOffice.notifyAll();
}
return;



Бухгалтер фиксирует прибыль и выводит отчет (итоговую прибыль).

Нафиг бухгалтера. Он будет только за периодические отчеты отвечать. Итоговый отчет выводить отдельно в главном потоке.

Как-то так. IMHO. Не проверял. Пишу не задумываюсь, могу где-то ошибаться.
...
Рейтинг: 0 / 0
15.01.2016, 12:25
    #39148129
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
А что за ! Interrupted в цикле ? И немного не понял с обьектами, как строится сам класс в вашем примере?
...
Рейтинг: 0 / 0
15.01.2016, 12:51
    #39148164
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Interrupted нашел, а вот как в коде записать покупку, продажу, как сделать что б отдлельный человек отнимал часть от всей суммы?
...
Рейтинг: 0 / 0
15.01.2016, 12:54
    #39148169
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Azarnoy ! Interrupted в цикле
Какой нибудь флаг, по которому мы можем завершить поток. Что бы его по окончанию программы более-менее корректно закрыть, а не прибивать кирпичом по башке.

Например, можно использовать вызов метода interrupted() из класса Thread.

Конечно, если sleep выкидывает InterruptedException, то возможно можно и просто while( true ), бесконечный цикл, но на мой взгляд, лучше все же параллельно какой-то флаг иметь. Но это IMHO.
AzarnoyИ немного не понял с обьектами, как строится сам класс в вашем примере?

В смысле "сам класс" ?
Если ты про ObmenkaPotoki, то:
переменные hrn, usd и всю логику работы с ними вынести в отдельный класс - ChangeOffice. Методы изменяющие данные поля, сделать synchronized.

Создать объекты, запустить потоки - тут у тебя все хорошо, но нужно еще сделать ChangeOffice и передать его в потоки.
Подождать на changeOffice.wait
Напечатать окончательный отчет
Попытаться прибить потоки. ( например просто вызовом interrupt() + join для ожидания завершения )
Выйти из программы.

В ObmenkaPotoki минимум кода, никаких нафиг static переменных (убрать в ChangeOffice) и, вообще, минимум какой либо логики в main. IMHO
...
Рейтинг: 0 / 0
15.01.2016, 12:57
    #39148175
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Leonid Kudryavtsev,

Это я понял, я не пойму как в ChangeOffice записать работу с валютой, что б ее вызывать в классе, что б пришел человек, забрал часть, пришел забрал еще часть и тд
...
Рейтинг: 0 / 0
15.01.2016, 13:12
    #39148194
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
AzarnoyЭто я понял, я не пойму как в ChangeOffice записать работу с валютой, что б ее вызывать в классе, что б пришел человек, забрал часть, пришел забрал еще часть и тд
Ну для этого нужно сначала СФОРМУЛИРОВАТЬ правила "работы с валютой"

Их в Вашем исходном сообщении не обнаружено. Если валюта продавать/покупать по курсу 1:0. Т.е. бесплатно дарится/забирается.

Т.к. никаких правил формирования курса у Вас вроде нет (может не внимательно читал), то вполне пойдет ))) такой обменник времен коммунизма )))


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class ChangeOffice {
private boolean is_closed;
private int backs_sum;

public ChangeOffice() {
  backs_sum = 1000; // Для начала 1000 баксов
  is_closed = false;     // Открылись
}

public synchronized boolean getIsClosed()  {
  return this.is_closed()
}
// Человек продает, обменник покупает/берет (добавляем)
void synchronized sell_baks( int backs ) {
  if ( is_closed )
     return;  // или Exception
  } 
  this.backs_sum += backs;
  }

// Человек покупает, обменник продает/отдает (вычитаем)
void synchronized bay_baks( int backs ) {
  if ( is_closed )
     return;  // или Exception
  } 
  if ( this.backs_sum >= backs )  {
     this.backs_sum -= backs;
  }  else { // Почти всю валюту с...ки забрали. Закрываемся, остатки выводим за границу, объявляем дефолт.
     this.is_closed = true;
     this.notifyAll();
  }
}  // bay_baks

} // class



...
Рейтинг: 0 / 0
15.01.2016, 13:17
    #39148196
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
а если курс приписать, это куда?
...
Рейтинг: 0 / 0
15.01.2016, 13:20
    #39148200
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
к примеру 24.1 26.3
...
Рейтинг: 0 / 0
15.01.2016, 13:25
    #39148206
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Leonid Kudryavtsev,

и у вас показан только доллар, а у меня 2 валюты, и одна должна уменьшатся, другая увеличивается по идее, и останавливатся когда одна из них закончится
...
Рейтинг: 0 / 0
15.01.2016, 13:41
    #39148219
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Azarnoyи у вас показан только доллар, а у меня 2 валюты, и одна должна уменьшатся, другая увеличивается по идее, и останавливатся когда одна из них закончится
В чем проблема добавить вторую валюту?
...
Рейтинг: 0 / 0
15.01.2016, 13:54
    #39148225
Azarnoy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа "симулятор обменки" с потоками
Leonid Kudryavtsev,

это еще два метода надо? или в эти же?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа "симулятор обменки" с потоками / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]