Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Возвращаемы данные от Демона


Автор: barin_Student 11.4.2008, 09:26
Собственно вопрос , есть ли какая возможность перестать брать данные у демона , если он их не дает.
Вот такая вещь:
Код

public class demon extends Thread
{
     public boolean Beskonechny()
     {
          boolean status = false;
          while(true)
          {
               System.out.println("ne vieder");
           }
           return status;
      }
       
//  и метод run .....

а вот в другом классе я одемонизирую процесс , и попрошу статус у Beskonechny()
Код

   demon d = new demon();
   d.setDaemon(true);
   d.start();
   boolean oblom = d.Beskonechny();

вот вопрос , как спросить этот статус , и через какое то время неответа проскочить эту байду.
Да только без дополнительных методов в demon getStatus() и тд , возможно ли это ище какими то инструментами это решить. smile 

Автор: LSD 11.4.2008, 12:57
Как-то так:
Код

public class Test implements Runnable
{
  private static final Object LOCK = new Object();

  private Object result;
  private boolean isResultReady;

  public static void main(String[] args) throws Exception
  {
    Test test = new Test();
    new Thread(test).start();

    try
    {
      test.getResult(1000);
      System.out.println("getResult(1000) success");
    }
    catch(Exception e)
    {
      System.err.println("getResult(1000) failed");
      e.printStackTrace();
    }

    try
    {
      test.getResult(60 * 1000);
      System.out.println("getResult(60 * 1000) success");
    }
    catch(Exception e)
    {
      System.err.println("getResult(61 * 1000) failed");
      e.printStackTrace();
    }
  }

  public Object getResult(long timeout) throws InterruptedException, NotReadyException
  {
    synchronized(LOCK)
    {
      if(isResultReady)
        return result;

      LOCK.wait(timeout);
    }
    if(isResultReady)
      return result;
    else
      throw new NotReadyException();
  }

  public void run()
  {
    try
    {
      Thread.sleep(60 * 1000);
    }
    catch(InterruptedException e)
    {
      e.printStackTrace();
    }

    result = new Object();

    synchronized(LOCK)
    {
      isResultReady = true;
      LOCK.notifyAll();
    }
  }

  public static class NotReadyException extends Exception
  {
  }
}

Автор: barin_Student 11.4.2008, 13:20
Я так понял , что в этом примере , мы ждем поток на ответ в течение секунды(а поток дает результат только через минуту) , после ожидания секунды.... Вопщем чего то я не понял , сорри что с такими просьбами обращаюсь , а если на моем примере добавить код (незнаю какой) чтоб ждал скажем 5 секунд , и посе неответа проходил (основной поток) дальше, не останавливался навсегда?... smile 

Автор: LSD 11.4.2008, 13:37
Основной метод тут это getResult(), ему передается таймаут в течении которого нужно ждать результат. Когда вызывается этот метод он захватывает блокировку на LOCK и проверяет не готов ли результат. Если рузультат готов, то он его просто возвращает, иначе засыпает на указанный таймаут. После пробуждения снова проверяет не готов ли результат и возвращает его или выбрасывает ошибку. Метод run() просто симулирует долгое создание объекта. Главное в нем это:
Код

synchronized(LOCK)
{
  isResultReady = true;
  LOCK.notifyAll();
}

после того как объект был создан.

Автор: barin_Student 11.4.2008, 13:52
Ок спасибо , теперь ясно, после выходных разберусь. а счас просто поигрась с этим кодом, и тема пускай пока открыта , а к выходным я ее закрою.
Спасибо вам LSD. smile 

Автор: barin_Student 14.4.2008, 07:26
Балин , с вашим кодом разобрался, все ясно и понятно... Но к своему коду прикрутить не получается , кто может хотябы прикрутить к моему примеру, в вот этот Лок до конца не понял... Буду благодарен если я вижу в привычном мне виде. smile  smile 

Автор: LSD 14.4.2008, 11:02
Чего там прикручивать, просто возьми и используй. Замени:
Код

    try
    {
      Thread.sleep(60 * 1000);
    }
    catch(InterruptedException e)
    {
      e.printStackTrace();
    }

    result = new Object();

на свой код создания объектов и все. При желании можешь переименовать методы.

Автор: barin_Student 14.4.2008, 11:32
Код

public class Test
{
    demon d = new demon();   
    public static void main(String args[])
    {
        boolean s =d.Read(1000);
        System.out.println("Ura");
    }
}


Код

public class demon extends Thread
{
     public boolean Read(int timeOut)
     {
          boolean status= false;
          while(true)
          {
           }
          return status;
            
    }
}

и вот куда маньячить этот Object и тому подобное? ведь я вправду не знаю. smile 

Автор: barin_Student 14.4.2008, 13:53
И неужели никто кроме LCD с этим не сталкивался , и не может переделать мой пример под пример LCD  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)