Powiedzmy, mamy następujące klasy:W jaki sposób JavaFX 8 uruchamia wątek aplikacji JavaFX w prawie pustej klasie aplikacji?
import javafx.application.Application;
import javafx.stage.Stage;
public class Test extends Application
{
public Test()
{
System.out.println("Constructor");
}
@Override
public void start(Stage primaryStage) throws Exception
{
System.out.println("start");
}
public static void main(String... args)
{
System.out.println("main");
}
}
To pochodzi od Application
ale nie korzysta z żadnego z jego metod. Zwykle uruchamiasz aplikację JavaFX, dzwoniąc pod numer launch(args)
.
Po uruchomieniu tego programu jedynym wyjściem jest "main", więc konstruktor i start nie są wywoływane, ale program nie kończy się, ponieważ działa wątek aplikacji JavaFX. Ale skąd się bierze?
Zrobiłem kilka debugowania i okazało się, że wątek jest uruchamiany z głównego wątku przed uruchomieniem głównej metody. Śledzenie stosu rozpoczyna się od NativeMethodAccessorImpl
.
Aby uzyskać jeszcze dziwniejsze: kiedy zacznę główne metody z innej klasy, nitka JavaFX aplikacji nie jest uruchomiony:
public class Test2
{
public static void main(String[] args)
{
Test.main(args);
}
}
Więc jaki rodzaj czarnej magii to jest?
Awans na czarną magię. – GGrec
W drugiej klasie, Test2, nie dodano rozszerzenia aplikacji w oryginalnej deklaracji klasy. Tak więc środowisko wykonawcze nie ma pojęcia, że proces JavaFX jest zaangażowany - może to być główna (.) Metoda dowolnego innego rodzaju klasy Java. – Trunk