2014-02-16 10 views
3

Я видел несколько разных способов создания новой темы, но есть один из способов, о которых я, по-видимому, забыл, и не могу найти много примеров этого, и я хотел бы сравнить его с другим способом:Различия в создании темы?

Это один я, казалось, забыли о, я не уверен, если это требуется для осуществления Runnable или нет:

new Thread() 
    { 
     public void run() 
     { 
      System.out.println("running"); 
     } 
    }; 

vs.

new Thread(new Runnable() 
    { 
     public void run() 
     { 
      System.out.println("Running"); 
     } 
    }); 

различия? Преимущества недостатки?

и когда я должен делать анонимную тему, а также когда выполнять Runnable?

+3

Есть важный вопрос, вы проверили? http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread – qqilihq

ответ

3

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

Там нет никаких признаков Thread подкласса в вашем вопросе, поэтому здесь отметить делать с расширением Thread или реализации Runnable, здесь.

Здесь вы только создаете объект Thread двумя разными способами, используя два разных конструктора. Во втором случае вы используете версию конструктора this для создания нового экземпляра Thread. Вы в основном предоставляете внешний объект Runnable для запуска его метода выполнения, когда выполняется поток создания экземпляров.

Here является исходным кодом run метода, здесь вы увидите, что в, run метода Thread, target «s run вызываются метод, в случае, если вы предоставили!

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

Для решения любой путаницы вы можете просто ознакомиться с исходным кодом!

+0

'В вашем вопросе нет знака подкласса Thread' ---' new Thread() {...} 'создает подкласс «Thread». Вы этого не знаете? –

1

Нет заметной разницы, если вы создадите anonymous classes, как вы указали в вопросе.

Однако разница между Thread t = new SubClassOfThread(); и Thread t = new Thread(new ClassImplementingRunnable) что

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

1

Я предпочитаю второй способ, потому что он отделяет Runnable от Thread.

Первый способ создает новый анонимный класс, который расширяет Thread. Но вы должны расширять еще один класс в смысле «есть». В вашем примере это будет нормально, но если ответственность за метод run будет расти, было бы проще сказать, что ваша функция Runnable, но не то, что ее основная цель - быть Thread.

1

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

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

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