Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

например.

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

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

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

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

например,

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

Ответ 3

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

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

Ответ 4

Просто запустите start()

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

Ответ 5

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

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

Ответ 6

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

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