Как запустить анонимный класс потока


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

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

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

8 57

8 ответов:

вы уже создаете экземпляр класса 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();

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

например.

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, поскольку компилятор предупредит вас, если вы случайно получите подпись метода неправильно (для анонимного класса он все равно предупредит вас I подумайте, как анонимные классы не могут определить новые непубличные методы).

например

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

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

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 должен быть запущен по новой нитке. Это лучший образец.

просто вызовите start ()

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

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

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

добавить: Теперь вы можете использовать лямбда для упрощения синтаксиса.

public class A {
    public static void main(String[] arg)
    {
        Thread th = new Thread(() -> {System.out.println("blah");});
        th.start();
    }
}

Я удивлен, что я не видел никакого упоминания о структуре исполнителя Java для ответов на этот вопрос. Одним из основных пунктов продажи платформы Executor является то, что вам не нужно иметь дело с потоками низкого уровня. Вместо этого вы имеете дело с более высоким уровнем абстракции ExecutorServices. Итак, вместо того, чтобы вручную запускать поток, просто выполните исполнитель, который обертывает 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.

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

new Thread (() - > whatever ()).start ();