powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Программа "симулятор обменки" с потоками
13 сообщений из 13, страница 1 из 1
Программа "симулятор обменки" с потоками
    #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
Программа "симулятор обменки" с потоками
    #39148061
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azarnoy,

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

С уважением, Валентин
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #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
Программа "симулятор обменки" с потоками
    #39148129
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что за ! Interrupted в цикле ? И немного не понял с обьектами, как строится сам класс в вашем примере?
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #39148164
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Interrupted нашел, а вот как в коде записать покупку, продажу, как сделать что б отдлельный человек отнимал часть от всей суммы?
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #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
Программа "симулятор обменки" с потоками
    #39148175
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Это я понял, я не пойму как в ChangeOffice записать работу с валютой, что б ее вызывать в классе, что б пришел человек, забрал часть, пришел забрал еще часть и тд
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #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
Программа "симулятор обменки" с потоками
    #39148196
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если курс приписать, это куда?
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #39148200
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к примеру 24.1 26.3
...
Рейтинг: 0 / 0
Программа "симулятор обменки" с потоками
    #39148206
Azarnoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

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

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


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