2013-12-06 3 views
2

Я не мог найти вопрос, достаточно похожий на это, но я извиняюсь, если это дубликат.Разница между объектами и Runnable

//do something 

//start 

new Thread(r).start(); 

    Runnable r = new Runnable() { 
     public void run() { 
      try{ 
       Thread.sleep(5000); 
       //do something 
      } 
      catch(InterruptedException e){} 
     } 
    };//end new Runnable 

Мой вопрос: Я использую нить? или просто выполняемый объект? Не уверен, что я даже задаю осмысленный вопрос?

Я новичок в вопросах, но мое понимание этого кода: Я начинаю новую тему, передавая ее запущенному объекту и запускает метод переопределенного запуска, в этом случае поток будет спать в течение 5 секунд. Выполнять работу.

+2

Концепция нитей всегда сбивает с толку. Но да что-нибудь, что можно запустить внутри run(), будет отдельным Thread. – Quillion

+0

Позволяет сказать «новая тема (r) .start();» находится внутри цикла. Каждый раз, когда выполняется этот оператор, начинается новый Thread или текущий Thread становится новым? – cupojava

+0

вы говорите новый каждый раз. Поэтому, пока вы продолжаете использовать слово new в своем коде, тогда создается новый поток в цикле for. – Quillion

ответ

2

Да, вы используете Thread. Вы создаете его, передавая его конструктору объект Runnable.

«Я начинаю новый поток, передавая ему запущенный объект, и он начинает метод переопределенного запуска, в этом случае поток будет спать в течение 5 секунд, а затем работать».

Это правильно, но ключевой момент отсутствует: этот метод запуска будет выполнен в другом/новом потоке, а не в потоке, с которого вы вызвали start() в созданном объекте Thread.

2

Интерфейс Runnable просто декларирует тот факт, что класс, который его реализует, может быть выполнен в потоке, так что он обеспечивает интерфейс, который будет вызываться и выполняться внешним потоком, не более того.

A Thread реализует Runnable, так как он может выполнить свой собственный метод run(), но Runnable вообще не имеет ничего общего с самой резьбой. По умолчанию run() Thread не делает ничего, поэтому вы обычно расширяете его и определяете конкретное поведение вашего потока.

Но для пояснения, ThreadPoolExecutor принимает Runnable объектов, таких как Thread. Это просто интерфейс, который объявляет, что определение класса действительно является исполняемым (или исполняемым).

2
  1. Вы создали новую анонимную реализацию интерфейса Runnable.
  2. Этой реализация povided действия, выполняемые при выполнении этой реализации в новом Thread
  3. Вы создали новый Thread (new Thread(r)) и передала анонимный экземпляр нитки экземпляру
  4. Когда вы приступили к выполнению нитки (new Thread(r).start()) , jvm создал новый поток. Этот новый поток, в свою очередь, вызывал метод run() анонимной реализации Runnable.
2

Экземпляр Thread (как вы создаете в первой строке кода) представляет собой физическую нить. Когда вы вызываете start(), JVM создаст новый поток (используя собственные методы ОС для этого) и начнет его выполнение.

A Runnable - это просто интерфейс, который определяет метод run() (как и в вашей второй строке кода). Если вы передадите любой объект, реализующий Runnable, в конструктор Thread, тогда поток выполнит код, определенный в методе run().

Runnable s очень легкий, поскольку они определяют только один метод, в то время как Thread s поставляются с тяжелым весом физической нити.

Непосредственно создание Thread не рекомендуется, так как это дорогостоящая операция. Я настоятельно рекомендую вам посмотреть на java Executors framework, поскольку он обеспечивает гибкий способ создания пулов потоков и отправки задач (в виде Runnable s или Callable s) им. Структура Executors предоставляет неоценимые возможности для повторного использования потоков.

Смежные вопросы