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