С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413

Организация многопоточности

29.03.2016, 09:40. Показов 1712. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане!
Кто знаком с многопоточностью подскажите пожалуйста как лучше организовать многопоточность приложения, смысл в том что необходимо смоделировать одновременное оформление заказов несколькими покупателями:

1. Реализовать отдельный поток для каждого покупателя. Количество покупателей вводить при запуске программы.Все заказы готовятся одним поваром. В один момент времени готовится максимум один заказ.

2. Покупатели могут совершать заказы в случайные моменты времени.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2016, 09:40
Ответы с готовыми решениями:

Странность в многопоточности
Доброго времени суток, разбираюсь с многопоточностью ( wait(), notify(), notifuAll() ). При разборе шаблона Consumer-Producer возникла...

Задача по многопоточности
Проходя тесты на certifications . ru наткнулся на такую задачу: При каких условиях метод check() вернет значение true, если вызов...

Использование Lock в многопоточности
доброго времени суток, имеются следующие классы: package by.epam.ph.main; import by.epam.ph.entity.Philosopher; public...

9
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
31.03.2016, 08:16
Цитата Сообщение от Alex_trader Посмотреть сообщение
1. Реализовать отдельный поток для каждого покупателя. Количество покупателей вводить при запуске программы.Все заказы готовятся одним поваром. В один момент времени готовится максимум один заказ.
2. Покупатели могут совершать заказы в случайные моменты времени.
https://docs.oracle.com/javase... Queue.html
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
01.04.2016, 12:50  [ТС]
korvin_, я вот как делаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.simbirsoft.ivanov;
 
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        final Scanner scanner = new Scanner(System.in);
        MultiCustomer customer = new MultiCustomer();
        System.out.println("Введите колличество покупателей");
        int count = scanner.nextInt();
        for (int i = 0; i < count; i++) {
            Thread newCustomer = new Thread(customer);
            newCustomer.start();
            try{
                newCustomer.join();
            }catch(InterruptedException e){
                LogWriter.getLog().error(e);
            }
        }
        System.out.println("Количество покупателей составило " + count + "чел.");
        System.out.println("Заказы всех покупателей:....... ");
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.simbirsoft.ivanov;
 
public class MultiCustomer extends Thread {
 
    Customer customer = new Customer();
    Localization local = new Localization();
    private final int COOKING_TIME = Integer.parseInt(local.getBundle().getString("COOKING_TIME"));
 
    public void run() {
        ConsoleJob console = new ConsoleJob();
        System.out.println();
        System.out.println("===========================================================");
        System.out.println("   Привет я покупатель номер " + customer.getCustomerId());
        System.out.println("===========================================================");
        System.out.println();
        try {
            console.start();   //некий метод, выполняющийся потоком
            customer.wait(COOKING_TIME);
        } catch (Exception ex) {
            System.err.println(ex);
        }
    }
}
Добавлено через 4 минуты
Но не всё работает как нужно, у кого нибудь есть опыт работы с пакетом java.util.concurrent?

Добавлено через 21 минуту
непонятно откуда вылетает
java.lang.IllegalMonitorStateException
0
27 / 27 / 24
Регистрация: 23.04.2011
Сообщений: 64
01.04.2016, 15:42
Alex_trader,
Исключение java.lang.IllegalMonitorStateException возникает, так как метод wait() ( customer.wait(COOKING_TIME); ) должен вызываться только из синхронизированного контекста!
К тому же Oracle рекомендует вызывать wait() в цикле while, чтобы исключить ситуацию ложного сигнала, и возобновления потока.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
01.04.2016, 15:47  [ТС]
Цитата Сообщение от Igor100 Посмотреть сообщение
Исключение java.lang.IllegalMonitorStateException возникает, так как метод wait() (customer.wait(COOKING_TIME) должен вызываться только из синхронизированного контекста!
К тому же Oracle рекомендует вызывать wait() в цикле while, чтобы исключить ситуацию ложного сигнала, и возобновления потока.
можно пример?

Добавлено через 35 секунд
не понятно, а на цикл какое условие?
0
27 / 27 / 24
Регистрация: 23.04.2011
Сообщений: 64
01.04.2016, 17:01
Лучший ответ Сообщение было отмечено Alex_trader как решение

Решение

Alex_trader,
Пример
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
35
36
37
38
39
40
41
class Example {
    void hello(int i) {
        System.out.println(Thread.currentThread().getName() + " " + i);
    }
}
 
class Realize implements Runnable {
    private boolean check; // Переключатель для цикла
    Example e;
    Realize(Example e, String name) { // Конструктор для создания и запуска потока
        this.e = e;
        new Thread(this, name).start();
    }
    public void run() { // Тело потока
        for (int i = 0; i < 5; i++) {
            try {
                check = false;
                synchronized (this) { // Синхронизированный блок
                    while (check) {
                        wait();
                    }
                    notify();
                }
                Thread.sleep(200);
            } catch(InterruptedException exc) {
                System.out.println(exc);
            }
            check = true;
            e.hello(i);
        }
    }
 
}
 
public class ThreadExample {
    public static void main(String[] args) {
        Example example = new Example();
        Realize realize0 = new Realize(example,"Первый поток");
        Realize realize1 = new Realize(example,"Второй поток");
    }
}
1
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
02.04.2016, 09:48  [ТС]
Igor100, В чём здесь раскрывается суть многопоточности?
Если нужно колличество потоков вводить при старте программы, как будет выглядеть этот код?

Добавлено через 1 час 52 минуты
всё равно ошибка:
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
35
36
37
38
39
40
41
42
43
44
package com.simbirsoft.ivanov;
 
public class MultiCustomer extends Thread {
    private boolean check; // Переключатель для цикла
    long startTime;
    long endTime;
    Customer customer = new Customer();
    Localization local = new Localization();
    private final int COOKING_TIME = Integer.parseInt(local.getBundle().getString("COOKING_TIME"));
 
    public synchronized void run() {
        startTime = System.currentTimeMillis();
        ConsoleJob console = new ConsoleJob();
        System.out.println();
        System.out.println("===========================================================");
        System.out.println("   Привет я покупатель номер " + customer.getCustomerId());
        System.out.println("===========================================================");
        System.out.println();
 
        try {
            check = false;
            synchronized (this) { // Синхронизированный блок
                while (check) {
                    wait();
                }
                notify();
            }
            Thread.sleep(200);
        } catch(InterruptedException exc) {
            System.out.println(exc);
        }
        check = true;
        console.start();
 
 
       /* try {
            console.start();
            customer.wait(COOKING_TIME);
        } catch (Exception ex) {
            System.err.println(ex);
        }*/
        endTime = System.currentTimeMillis();
    }
}
Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at com.simbirsoft.ivanov.ConsoleJob.command Menu(ConsoleJob.java:28)
at com.simbirsoft.ivanov.ConsoleJob.caseAdd (ConsoleJob.java:136)
at com.simbirsoft.ivanov.ConsoleJob.caseSet (ConsoleJob.java:155)
at com.simbirsoft.ivanov.ConsoleJob.command Menu(ConsoleJob.java:26)
at com.simbirsoft.ivanov.ConsoleJob.start(C onsoleJob.java:80)
at com.simbirsoft.ivanov.MultiCustomer.run( MultiCustomer.java:33)
at java.lang.Thread.run(Thread.java:745)
Добавлено через 6 минут
Igor100, спасибо, разобрался, в коде ещё один wait был))
0
27 / 27 / 24
Регистрация: 23.04.2011
Сообщений: 64
02.04.2016, 09:57
Alex_trader,
Постойте, я привел лишь пример, учтите то что:
Метод sleep(200) лишь для наглядности примера, так же как и переменная check.
И возможно, их применение в вашем случае излишне.
Для полноты информации советую вам, прочесть главу 11 "Многопоточное программирование" из книги Г.Шилдт Java 7 Подробное руководство, или Руководство для начинающих.
0
Заблокирован
02.04.2016, 13:00
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
35
36
37
38
39
40
41
42
43
  List<Integer> list = Collections.synchronizedList(new ArrayList<Integer>());
        class Client implements Runnable {
            @Override
            public void run() {
                try {
                    Thread.sleep(new Random().nextInt(1001));
                } catch (InterruptedException e) {
                }
                System.out.println("Покупатель" + Thread.currentThread().getId() + " стал в очередь на заказ");
                list.add((int) Thread.currentThread().getId());
                System.out.println("Покупатель оформил заказ " + Thread.currentThread().getId());
            }
        }
 
        Runnable povar = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; ) {
                    try {
                        Thread.sleep(100);
                        System.out.println("Повар берет заказ");
                        if (list.size() != 0) {
                            int n = list.remove(0);
                            System.out.println("Повар взял заказ" + n);
                            Thread.sleep(400);
                            System.out.println("Повар выполнил заказ" + n);
                        } else {
                            System.out.println("Заказов нет");
                            i++;
                        }
                    } catch (InterruptedException e) {
                    }
                }
            }
        };
 
        Thread p = new Thread(povar);
        p.start();
        Thread[] th = new Thread[10];
        for (int i = 0; i < 10; i++) {
            th[i] = new Thread(new Client());
            th[i].start();
        }
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
02.04.2016, 14:40  [ТС]
Интересный вариант

Добавлено через 2 минуты
Попробую покрутить в свой код
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.04.2016, 14:40
Помогаю со студенческими работами здесь

Какой смысл синхронизации в многопоточности ?
Зачем нужно синхронизировать переменные(ресурсы) или методы если они итак портят принцип паралелизма, зачем вообще эту тему внесли в...

Запись в файл в режиме многопоточности
Подскажите пожалуйста что я делаю неправильно в этой программе. Серверная часть должна считывать то, что отправил пользователь, и разослать...

Проблема многопоточности в электронной доске объявлений
В Универе дали задание для курсового проекта: Сервер – БД электронной доски объявлений. Поддерживает одновременную работу с ...

Что значит слово freeze в контексте многопоточности
Иногда в умных (или псевдо-умных, трудно сказать) беседах про многопоточность встречается такое слово как freeze. Никогда не понимал о чем...

Написать алгоритм рекурсивного перебора папок в многопоточности с использованием Fork/Join Framework
Написать алгоритм рекурсивного перебора папок в многопоточности с использованием Fork/Join Framework


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru