Как запустить анонимный класс потока - PullRequest
59 голосов
/ 09 марта 2012

У меня есть следующий фрагмент кода:

public class A {
    public static void main(String[] arg) {
        new Thread() {
            public void run() {
                System.out.println("blah");
            }
        };
    }
}

Здесь, как мне вызвать метод start() для потока, не создавая экземпляр класса потока?

Ответы [ 8 ]

137 голосов
/ 09 марта 2012

Вы уже создаете экземпляр класса Thread - вы просто ничего с ним не делаете. Вы можете вызвать start(), даже не используя локальную переменную:

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

... но лично я обычно назначаю ее локальной переменной, делаю все что угодно (например, задаю имя и т. Д.) И затем запускаю ее:

Thread t = new Thread() {
    public void run() {
        System.out.println("blah");
    }
};
t.start();
14 голосов
/ 09 марта 2012

Поскольку анонимные классы расширяют данный класс, вы можете хранить их в переменной.

например.

Thread t = new Thread()
{
    public void run() {
        System.out.println("blah");
    }
};
t.start();

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

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
// similar to new Thread().start();

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

например

new Thread(new Runnable()
{
    @Override
    public void run() {
        System.out.println("blah");
    }
}).start();
6 голосов
/ 09 марта 2012

Не совсем уверен, что это то, что вы просите, но вы можете сделать что-то вроде:

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

Обратите внимание на метод start() в конце анонимного класса.Вы создаете объект потока, но вам нужно запустить его, чтобы фактически получить другой работающий поток.

Лучше, чем создать анонимный класс Thread, это создать анонимный класс Runnable:

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

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

3 голосов
/ 09 марта 2012

Все выражение new является ссылкой на объект, поэтому к нему можно вызывать методы:

public class A {
    public static void main(String[] arg)
    {
        new Thread()
        {
            public void run() {
                System.out.println("blah");
            }
        }.start();
    }
}
3 голосов
/ 09 марта 2012

Просто позвоните в пуск ()

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
2 голосов
/ 17 декабря 2017

Добавить: теперь вы можете использовать лямбду, чтобы упростить ваш синтаксис. Требование: Java 8 +

public class A {
    public static void main(String[] arg)
    {
        Thread th = new Thread(() -> {System.out.println("blah");});
        th.start();
    }
}
0 голосов
/ 08 апреля 2018

Оставьте это здесь для дальнейшего использования, но это тоже ответ.

новый поток (() -> что угодно ()). Start ();

0 голосов
/ 04 января 2018

Я удивлен, что не нашел упоминания об Java-среде Executor для ответов на этот вопрос. Одним из главных преимуществ реализации платформы Executor является то, что вам не нужно иметь дело с потоками низкого уровня. Вместо этого вы имеете дело с более высоким уровнем абстракции ExecutorService s. Таким образом, вместо ручного запуска потока, просто запустите исполнитель, который оборачивает Runnable. При использовании однопотокового исполнителя созданный вами экземпляр Runnable будет внутренне обернут и выполнен как поток.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// ...

ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
try {
  threadExecutor.execute(
    new Runnable() {
      @Override
      public void run() {
        System.out.println("blah");
      }
    }
  );
} finally {
    threadExecutor.shutdownNow();
}

Для удобства см. Код на JDoodle .

...