Как начать анонимный класс потока
У меня есть следующий фрагмент кода:
public class A {
public static void main(String[] arg)
{
new Thread()
{
public void run() {
System.out.println("blah");
}
};
}
}
Здесь, как я могу вызвать метод start()
для потока без создания экземпляра класса потока?
Ответы
Ответ 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();
}
}