LINUX.ORG.RU

[java] Первые шаги

 


0

0

Занялся тут на досуге изучением явы. Решил начать ознакомление с книжки Шильдта.

Дошел до "потоков" и столкнулся с такой строчкой кода:
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
Помогите, пожалуйста, понять что значит точка после метода currentThread() и как понять эту строку с синтаксической точки зрения. В книжке пояснения не нашел.

★★★★★
Ответ на: комментарий от Floid

>setPriority вызовется у объекта, который вернула currentThread

спасибо, теперь понял.

Dudraug ★★★★★
() автор топика

Установить нормальный приоритет исполнения потока.

Английский знаешь? Логикой владеешь? :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

>Английский знаешь? Логикой владеешь? :)

Что делает то понятно, я спрашивал про синтаксис, просто для меня, как для человека слабо знакомого с ООП, все это в новинку. Товарищ Floid ответил на мой вопрос, как раз так как я хотел.

Dudraug ★★★★★
() автор топика

> Thread.currentThread().setPriority(Thread.NORM_PRIORITY);

заодно, чтобы было понятно почему в С++ такая запись обычно не используется. Потому что для этого в общем случае нужно автоматическое управление памятью, через сборщик мусора. Потому что Thread сам по себе first class object, Thread.currentThread() -- тоже, и у разных ниток вернут разные объекты с разным временем жизни. Которые в случае GC прибьются автоматически сборщиком мусора, а вот с ручным управлением памятью будет уже тяжко (но тоже можно, на уровне 1 отдельного приложения. С общей VM можно на уровне всей системы (VM)).

Сюда же и анонимные классы. Класс может вернуть новый класс в куче, поэтому нужен GC.

anonymous
()
Ответ на: комментарий от anonymous

Ничего сложного:
class Thread {
public:
  static Thread currentThread() { return Thread(get_current_thread_handle()); }
  void setPriority(priority_type priority) { set_thread_priority(handle, priority); }

private:
  handle_type handle;
  Thread(handle_type _handle): handle(_handle) {}
};

int main()
{
  Thread::currentThread().setPriority(ANY_PRIORITY);
  return 0;
}

PS: Лень было маны по pthread читать.

Devix
()
Ответ на: комментарий от Devix

> static Thread currentThread() {..}

не всегда так получится (с static). Если например, надо создать новый объект и вернуть его в этой функции.

anonymous
()
Ответ на: комментарий от anonymous

Ты походу парень про конструктор копий не знаешь?

Devix
()
Ответ на: комментарий от Devix

нет, не так. И конструктор копирования тут не причем. И свой аллокатор в new тоже.

Кури по замыкания, продолжения. Если скажешь, как в C++ делать финты вроде второго примера про swing по ссылке http://en.wikipedia.org/wiki/Continuation_passing_style#Continuations_as_objects , тебе медаль. Шоколадная.

anonymous
()
Ответ на: комментарий от anonymous

class SwingRunnable {
  public:
    SwingRunnable(int _result): result(_result) {}
    
    void operator()()
    {
       setField(result);
    }

  private:
    int result;
};

class ButtonRunnable {
  public:
    ButtonRunnable(int _parameter): parameter(_parameter) {}

    void operator()()
    {
      int result = lookup(parameter);

      javax::swing::SwingUtilities::invokeLater(SwingRunnable(result));
    }

  private:
    int _parameter;
};

void buttonHandler() {
  int parameter = getField();
 
  boost::thread(ButtonRunnable(parameter));
}

Devix
()
Ответ на: комментарий от Devix

Если я правильно понимаю то:
javax::swing::SwingUtilities::invokeLater запихивает в глобальный пул классы которые выполнятся в потоке Swing. Ну тоесть примерно так:

#define WAIT_SECOND 30;

pool<boost::function<void ()> > global_pool;

void javax::swing::SwingUtilities::invokeLater(boost::function<void ()> func)
{
   global_pool.put(func);
}

int main()
{
  while (true) {
    if (WaitMessage(WAIT_SECOND))
      ProcessMessage();
    else
      global_pool.run();
  }
}

Devix
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.