Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация синхронизированной работы, Допрыгался. 
V
    Опции темы
Platon
Дата 24.1.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Свелось всё к классической задачке ^_^

Код

public class ResponseWaitor<E> {

    private LinkedList<E> queue = new LinkedList<E>();
    private final Object lock = new Object();
    public void add(E obj) {
        synchronized(lock) {
            queue.add(obj);
            lock.notify();
        }
    }
    
    public E get() {
        synchronized(lock) {
            while (queue.isEmpty()) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    return null;
                }
            }
            return queue.removeFirst();
        }
        
    }
}


Это сообщение отредактировал(а) Platon - 24.1.2008, 11:40
PM MAIL ICQ   Вверх
Platon
Дата 24.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



И получается не так уж и страшно:

Код

private ResponseWaitor<Boolean> waitor; 

    public boolean addUserToContacts(String sn, String sn1) {
        connection.write(new AddUserRequest(sn, sn1));
        return waitor.get();

    }

    void userAdded(boolean added) {
        waitor.add(added);
    }

PM MAIL ICQ   Вверх
Platon
Дата 26.1.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Нет, вариант оказался неправильным, вот новый, но я даже не рискнул его запустить, просто не укладывается в мозгу как сделать правильно.
Опытные тредеры!!! Нужна консультация.

Код

public class ResponseWaitor<E> {

    private final LinkedList<E> queue = new LinkedList<E>();
    private final LinkedList monitors = new LinkedList();

    public synchronized void add(E obj) {
        Object o;
        synchronized(monitors) {
            while (monitors.isEmpty()) {
                try {
                    monitors.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            o = monitors.removeFirst();
        }
        synchronized(queue) {
            queue.add(obj);
        }
        synchronized(o) {
            o.notify();
        }
    }

    public E get() {
        Object o;
        synchronized(monitors) {
            o = new Object();
            monitors.add(o);
            monitors.notify();
        }

        synchronized(queue) {
            while (queue.isEmpty()) {
                synchronized(o) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                }
            }
            return queue.removeFirst();
        }
    }
}


Добавлено через 6 минут и 47 секунд
Хм, нет, этот вариант конечно же завален.
PM MAIL ICQ   Вверх
Platon
Дата 26.1.2008, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Вот кажется валидный пример:

Код

public class ResponseWaitor<E> {

    private LinkedList<E> queue = new LinkedList<E>();
    private LinkedList monitors = new LinkedList();
    private final Object lock = new Object();
    public void add(E obj) {
        Object o;
        synchronized(lock) {
            while (monitors.isEmpty()) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            queue.add(obj);
            o = monitors.removeFirst();
        }

        synchronized(o) {
            o.notify();
        }
    }

    public E get() {
        Object o = new Object();
        synchronized(lock) {
            monitors.add(o);
            lock.notify();
        }
        synchronized(o) {
            while (queue.isEmpty()) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return queue.removeFirst();
        }
    }
}

PM MAIL ICQ   Вверх
Prol
Дата 26.1.2008, 20:51 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(LSD @ 23.1.2008,  15:41)
В любом случае проблема состоит в том, что надо усыплять поток до тех пор пока не придёт ответ. 

Усыплять поток - это всё равно что хальтовать процессор в ожидании немаскируемого прерывания :о))) Моветон :о) 
Да посади проц в фарева цикл на обработку задач :о)
PM MAIL WWW ICQ   Вверх
ivg
Дата 26.1.2008, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


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

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



Цитата(Prol @  26.1.2008,  20:51 Найти цитируемый пост)
Усыплять поток - это всё равно что хальтовать процессор в ожидании немаскируемого прерывания :о))) Моветон :о) 
Да посади проц в фарева цикл на обработку задач :о)

Мыслить в контексте однозадачности - вот моветон.  smile 
Вобщем, rtfm, как говорится.
PM MAIL   Вверх
Platon
Дата 26.1.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



Prol, от куда такие сведения? лупить в бесконечном цикле обработку задачи, которые поступают через неопределенные промежутки времени. Это убийство процессорного времени воистину!
PM MAIL ICQ   Вверх
Prol
Дата 26.1.2008, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(Platon @ 26.1.2008,  22:27)
Prol, от куда такие сведения? лупить в бесконечном цикле обработку задачи, которые поступают через неопределенные промежутки времени. Это убийство процессорного времени воистину!

Процессор должен работать, а человек - думать :о)

Не слипайте потоки, дайте им работу :о)
Если вы слипаете поток, значит он не нужен в вашей проге :о)
Зачем заводить поток, который вы же сами и останавливаете?

Вот классно сделано в транспьютерах: есть очередь процессоров, есть очередь задач,  свободный процессор отдаётся ожидающей задаче :о) Если процессорам нечего делать, значит все задачи выполнены :о)

PM MAIL WWW ICQ   Вверх
LSD
Дата 27.1.2008, 04:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Prol @  26.1.2008,  20:51 Найти цитируемый пост)
Усыплять поток - это всё равно что хальтовать процессор в ожидании немаскируемого прерывания :о))) Моветон :о) 
Да посади проц в фарева цикл на обработку задач :о) 

Полная чушь!
1. Приостанавливать поток, и выполнять halt у процессора - это две большие разницы.
2. Если задача предполагает ожидание некого события, то поток должен заснуть, а не молотить никому не нужный цикл напрасно загружая процессор.

Добавлено через 46 секунд
Цитата(Prol @  26.1.2008,  23:24 Найти цитируемый пост)
Не слипайте потоки, дайте им работу :о)
Если вы слипаете поток, значит он не нужен в вашей проге :о)
Зачем заводить поток, который вы же сами и останавливаете?

Ты не понимаешь разницы между остановкой и приостановкой?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 27.1.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(LSD @ 27.1.2008,  04:16)
2. Если задача предполагает ожидание некого события, то поток должен заснуть

А какое отношение поток имеет к задаче? Это два разных объекта :о) Если задаче нужно чего-то ожидать, то причём тут поток? Поток передаётся другой задаче :о)
PM MAIL WWW ICQ   Вверх
LSD
Дата 27.1.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Prol @  27.1.2008,  11:30 Найти цитируемый пост)
А какое отношение поток имеет к задаче? Это два разных объекта :о) Если задаче нужно чего-то ожидать, то причём тут поток? Поток передаётся другой задаче :о) 

Тяжкое наследие DOS-а, сами распределяем память, сами организуем многозадачность smile 

Во первых попробуй реализовать такой механизм, и посмотрим что у тебя получится smile 
Во вторых, что ты будешь делать если нужные данные поступили и пора возвращать управление первой задаче, а вторая задача которая заняла поток, еще и не думает заверщаться, или хуже того блокирована на IO-операции?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Prol
Дата 27.1.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 11.1.2008
Где: Кыев, Украина

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



Цитата(LSD @ 27.1.2008,  13:39)
Цитата(Prol @  27.1.2008,  11:30 Найти цитируемый пост)
А какое отношение поток имеет к задаче? Это два разных объекта :о) Если задаче нужно чего-то ожидать, то причём тут поток? Поток передаётся другой задаче :о) 


Во первых попробуй реализовать такой механизм, и посмотрим что у тебя получится smile 
Во вторых, что ты будешь делать если нужные данные поступили и пора возвращать управление первой задаче, а вторая задача которая заняла поток, еще и не думает заверщаться, или хуже того блокирована на IO-операции?

Нет необходимости писать свое

Даг Ли создал отличную открытую библиотеку утилит параллельности, util.concurrent, которая включает объекты-мьютексы, семафоры, коллекции, такие как очереди и хэш-таблицы, хорошо работающие при параллельном доступе, и несколько реализаций рабочей очереди. Класс PooledExecutor из этого пакета - эффективная, широко использующаяся, правильная реализация пула потоков, основанного на рабочей очереди. Прежде чем пытаться писать собственное программное обеспечение, которое вполне может оказаться неправильным, вы можете рассмотреть использование некоторых утилит в util.concurrent. Библиотека util.concurrent включена в Java Development Kit 1.5.

Вот хороший учебник для овладения с практическими примерами.
http://gee.cs.oswego.edu/dl/classes/EDU/os...rent/intro.html




Это сообщение отредактировал(а) Prol - 27.1.2008, 16:49
PM MAIL WWW ICQ   Вверх
Platon
Дата 27.1.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

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



В этом вопросе я уже не компетентен...

Добавлено через 9 минут и 33 секунды
хммм, в тамом случае, хотелось бы увидеть от Prol решения моей проблемы с помощью стандартного пакета Java, из этого я думаю, сможет получиться хорошая статья.

Это сообщение отредактировал(а) Platon - 27.1.2008, 17:25
PM MAIL ICQ   Вверх
LSD
Дата 28.1.2008, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Prol @  27.1.2008,  16:48 Найти цитируемый пост)
Даг Ли создал отличную открытую библиотеку утилит параллельности, util.concurrent, которая включает объекты-мьютексы, семафоры, коллекции, такие как очереди и хэш-таблицы, хорошо работающие при параллельном доступе, и несколько реализаций рабочей очереди. Класс PooledExecutor из этого пакета - эффективная, широко использующаяся, правильная реализация пула потоков, основанного на рабочей очереди. Прежде чем пытаться писать собственное программное обеспечение, которое вполне может оказаться неправильным, вы можете рассмотреть использование некоторых утилит в util.concurrent.

Из java.util.concurrent в данном случае, я вижу применимость только для Lock/Condition. Каким образом ты предлагаешь использовать PooledExecutor для данной задачи?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
COVD
Дата 28.1.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Не морочьте голову  smile .  В java есть только потоки (threads). В приложении может быть запущено много потоков. Потокам выделяется память и периодически порция процессорного времени в зависимости от приоритета потока. Если для выполнения действий в потоке требуется дождаться некоторого события, то поток переводится в состояние ожидания и свою порцию процессорного времени использовать не будет.
Prol, java потоки - это воплощение вашей идеи с независимыми приложениями, использующими общую память. Можете гордиться  smile .  

Это сообщение отредактировал(а) COVD - 28.1.2008, 19:32
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

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


 




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


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

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