2014-11-30 2 views
3

Я недавно начал копаться в Multi-Threading в Java. Изучая вещи, я обнаружил, что есть 2 быстрых и грязных способа создания потоков «на ходу» в Java. Вот пример:Грязные способы создания потоков в Java

public static void main(String[] args) { 
    System.out.println("Thread: " + Thread.currentThread().getName()); 

    new Thread() { 
     public void run() { 
      System.out.println("Thread: " 
        + Thread.currentThread().getName()); 
      System.out.println("hello"); 
     } 
    }.start(); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      System.out.println("Thread: " 
        + Thread.currentThread().getName()); 
      System.out.println("hello"); 
     } 

    }).start(); 
} 
  1. Первый из них является та, которая начинается с new Thread() {
  2. Второй приходит после того, которое начинается с new Thread(new Runnable() {

Я просто хотел, если спросить, как из пути правильны? Любая разница, отличная от разницы в реализации Управляемый интерфейс v/s Расширение Класс темы?

+0

Какое понятие «грязный» вы имеете в виду? –

+0

@ChrisMartin «грязный», как в Thread, не связан ни с одним классом. Должен ли я перефразировать «встроенный»? – Anurag

+1

Я считаю, что слово, которое вы ищете, является «анонимным». –

ответ

7

Оба способа приемлемы (и ни один из способов не является «грязным», на мой взгляд). Первый - менее подробный и тот, который я бы предпочел в таком тривиальном случае. Если вы расширяете тему, так что вы также можете пропустить Thread.currentThread():

new Thread() { 
    public void run() { 
     System.out.println("Thread: " + getName()); 
     System.out.println("hello"); 
    } 
}.start(); 

В любом нетривиальном случае, однако (т.е. если поток делает больше, чем просто несколько оттисков) обычное правило "favor composition over inheritance" применяется, который выступает второй подход.

Если вы используете Java 8, вы можете даже воспользоваться тем фактом, что Runnable является функциональный интерфейс:

new Thread(() -> { 
    System.out.println("Thread: " + Thread.currentThread().getName()); 
    System.out.println("hello"); 
}).start() 

Заключительное примечание: я редко использую темы в эти дни. Всякий раз, когда я это делаю, я, как правило, переписываю его с помощью ExecutorServices.

+0

Что вы подразумеваете под _less verbose_? – Anurag

+2

Первый из них официально обескуражен, поэтому он подвергается воздействию всех внутренних элементов класса «Thread», что, возможно, приводит к неожиданному и неинтуитивному участию менее известных правил разрешения имен именования Java в отношении членов, о которых программист даже не подозревает. Общий принцип заключается в том, чтобы * Наслаждаться композицией над наследованием *. –

+0

@ Анураг, менее подробный, я имею в виду меньше кода (поскольку вы не учитываете часть 'new Runnable()'). Тем не менее, у Марко Тополника есть хорошая точка в отношении композиции. Корректируя мой ответ немного. – aioobe

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