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

Поиск:

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


Эксперт
***


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

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



зачем вообще эта задержка? поток, который кладет данные в очередь, может закончить свою работу в любое время. независимо от читающих
PM MAIL   Вверх
Platon
Дата 22.2.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ок, код некомпетентный, вот новый:

Код

public class ResponseWaitor1<E> {
    private LinkedBlockingQueue<E> queue = new LinkedBlockingQueue<E>();

    public void add(E obj) {
        queue.add(obj);
    }

    public E get() {
        return queue.poll();
    }

    public static void main(String[] args) throws InterruptedException {
        final ResponseWaitor1<Integer> waitor = new ResponseWaitor1<Integer>();

        Thread t1 = new Thread(new Runnable() {
            int i;
            public void run() {
                for (int i = 0; i < 40000; i++) {
                    waitor.add(i);
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            int i;
            public void run() {
                for (int i = 0; i < 20000; i++) {
                    System.out.println(Thread.currentThread().getId() + " " + waitor.get());
                }
            }
        });
        t2.start();

        Thread t3 = new Thread(new Runnable() {
            int i;
            public void run() {
                for (int i = 0; i < 20000; i++) {
                    System.out.println(Thread.currentThread().getId() + " " + waitor.get());
                }
            }
        });
        t3.start();
        t1.join();
        t2.join();
        t3.join();
        System.out.println("There are " + waitor.queue.size() + " items left in queue");
    }
}


Добавлено через 2 минуты и 50 секунд
Если что, сразу скажу, пробовал add/get делать синхронизированными.
PM MAIL ICQ   Вверх
Platon
Дата 25.2.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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

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


 




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


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

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