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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужен работающий пример с Semaphor 
V
    Опции темы
sith
Дата 25.6.2008, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нужно что бы два или более потоков запустились одновременно... подсказали мне что нужно исопльзовать класс Semaophor... но примера работающего я не нашел... может кто то знает... как это дело организовать...

Это сообщение отредактировал(а) sith - 25.6.2008, 23:58


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
inohodec
Дата 26.6.2008, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Лови smile

Код

import java.util.concurrent.Semaphore;

//Solving the mutual exclusion problem using Semaphore class

class Process2 extends Thread
{

  private int id;

  private Semaphore sem;

  public Process2(int i, Semaphore s)
  {
      id = i;
      sem = s;
  }

  private int random(int n)
  {
      return (int) Math.round(n * Math.random() - 0.5);
  }

  private void busy()
  {
      try
      {
          sleep(random(500));
      } catch (InterruptedException e)
      {
      }
  }

  private void noncritical()
  {
      System.out.println("Thread " + id + " is NON critical");
      busy();
  }

  private void critical()
  {
      System.out.println("Thread " + id + " entering critical section");
      busy();
      System.out.println("Thread " + id + " leaving critical section");
  }

  public void run()
  {
      for (int i = 0; i < 2; ++i)
      {
          noncritical();
          try
          {
              sem.acquire();
          } catch (InterruptedException e)
          {
              // ...
          }
          critical();
          sem.release();
      } 
  }

  public static void main(String[] args)
  {
      final int N = 4;

      System.out.println("Busy waiting...");

      //Semaphore(int permits, boolean fair) 
      Semaphore sem = new Semaphore(N, true);

      Process2 p[] = new Process2[N];

      for (int i = 0; i < N; i++)
      {
          p[i] = new Process2(i, sem);
          p[i].start();
      }
  }
}



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


Опытный
**


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

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



хм... я не очень тогда понимаю назначения этого семафора... я думал он нужен для того что бы потоки запустились в одно и тоже время... это так... и где доказательство этого ?


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
inohodec
Дата 26.6.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что значит в одно и тоже время ?
Семафор это классический синхронизационный примитив... 
У него есть две операции - занять ресурс и освободить ресурс. 

Вот тут еще есть про семафоры - http://forum.vingrad.ru/index.php?showtopi...ad=#entry779575

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


Опытный
**


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

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



что значит занять... или освободить... я не очень понимаю... можно на каком то примере обьяснить... собсвенно суть этого дела... 


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
inohodec
Дата 26.6.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Если у тебя есть 4-е потока, а ресурс может принять только 3-и
То ты ставишь семафор, у которого есть счетчик

Семафор - in = 3 (счетчик)

Когда приходит первый тред , семафор делает in-- (in == 2)
Для второ тоже in-- (in == 1)
И для третьего in-- (in == 0)

Когда 4-ый пытается получить доступ он видит что in == 0, и ждет пока один из 3-х первых не освободит ресурс 

Во время выхода потока, семафор делает in++

Где то так smile
PM MAIL   Вверх
sith
Дата 26.6.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ого... smile спасибо... это в корне отлечаеться от того что думал я... smile ... так работает явовский семафор?

Это сообщение отредактировал(а) sith - 26.6.2008, 13:05


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
inohodec
Дата 26.6.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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


 




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


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

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