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

Поиск:

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


Новичок



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

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



Здравствуйте! Вопрос по синхронизации потоков.

Главный поток ожидает сигналы с других двух потоков. Я использую wait()/notify() по некоторому объекту Object some; 
Подскажите пожалуйста можно ли при такой логике определять в главном потоке какой именно поток прислал сигнал notify()?

Заранее огромное спасибо.

Пример кода

Главный поток
Код

package javaapplication7;

import java.util.logging.Level;
import java.util.logging.Logger;

public class MainThread extends Thread{
    public void run(){
        Object some = new Object();
        new FirstThread(some);
        new SecondThread(some);
        synchronized(some){
            try {
                some.wait();
            } catch (Exception ex) {
                Logger.getLogger(MainThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        //тут нужно определить какой именно поток отослал сигнал.
    }
    public static void main(String args[]) {
        new MainThread().start();
    }
}
 

Вызываемые потоки, разница между ними только в интервале времени sleep

Код


package javaapplication7;

import java.util.logging.Level;
import java.util.logging.Logger;

public class FirstThread extends Thread{
    private Object synchObj;
    public FirstThread(Object synch){
        synchObj = synch;
        start();
    }
    public void run(){
         while(true){
            try {
                sleep(1000);
                System.out.println("first thread sent signal.");
                synchronized(synchObj){
                    synchObj.notify();
                }
            } catch (Exception ex) {
                Logger.getLogger(SecondThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

 


Код


package javaapplication7;

import java.util.logging.Level;
import java.util.logging.Logger;

public class SecondThread extends Thread{
    private Object synchObj;
    
    public SecondThread(Object synch){
        synchObj = synch;
        start();
    }
    public void run(){
        while(true){
            try {
                sleep(5000);
                System.out.println("second thread sent signal.");
                synchronized(synchObj){
                    synchObj.notify();
                }
            } catch (Exception ex) {
                Logger.getLogger(SecondThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

 
PM MAIL   Вверх
Skipy
Дата 3.8.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, такой функциональности в базе нет. Можно выставлять какой-то флаг.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
ktimtsa
Дата 3.8.2011, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Наверное придется написать специальный класс с возможностью записать в него строку, кто последний его "трогал". И по нему уже синхронизировать.  
Еще раз спасибо.
PM MAIL   Вверх
Farmazon
Дата 4.8.2011, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Едрён батон, используй Pipe для этой цели. И вместо Notify пихай сообщение с идентификатором потока...


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

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

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


 




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


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

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