Статический блок и основная резьба - PullRequest
3 голосов
/ 31 мая 2011

Я нашел очень интересную вещь, пытаясь с Java. Пожалуйста, найдите код ниже:

public class SimpleTest { 
    static{ 
        System.out.println(Thread.currentThread().getName()); 
        System.exit(0); 
    } 
} 

Вышеприведенная программа работает без каких-либо исключений (ну и хорошо, так как я выхожу из самого статического блока). Но я получил следующее в качестве вывода:

основной

Так как я не начал основной поток, как он был создан. Насколько я понимаю, статический блок выполняется во время загрузки. Тогда как основной поток входит в картину?

Может ли кто-нибудь дать краткое введение в процесс компиляции, загрузки и выполнения в jvm? Также использование rt.jar?

Спасибо заранее, Brinal

Ответы [ 4 ]

7 голосов
/ 31 мая 2011

Когда вы запускаете любую Java-программу, главный поток запускается первым.

Вывод, который вы видите, не указывает на то, что main метод выполняется.Скорее, это поток main .

Итак, каждый раз, когда вы запускаете Java-программу, у вас будет поток, называемый main executing.И, если этот поток немедленно выходит из JVM, то это все потоки, которые когда-либо будут выполняться.

Чтобы уточнить:

Согласно моему пониманию, статический блок выполняется во время загрузки.время.

Статический блок выполняется при загрузке класса.Это происходит с помощью загрузчика классов и выполняется в главном потоке при запуске Java-программы.

3 голосов
/ 31 мая 2011

Основной класс загружается и инициализируется в основном потоке.Хотя это нигде явно не задокументировано (насколько мне известно), это довольно безопасное предположение, поскольку вряд ли есть причина для его реализации по-другому.

1 голос
/ 31 мая 2011

Весь код Java выполняется в каком-то потоке.Обычно (что неудивительно) основной поток называется «основным».Обычно основной поток загружает основной класс (который выполняет статические блоки) и затем вызывает ваш метод main.

Однако у вас, похоже, нет метода main, так что если он имелЕсли вы сделали это из статического блока, ваша программа потерпела бы крах за исключением того, что main не найдено.

0 голосов
/ 31 мая 2011

Что-то должно быть загружено вашим классом SimpleTest, который должен был быть основным потоком (как указывает имя текущего потока). Не видя вызывающего кода, трудно понять, что здесь происходит, но что-то вызывает загрузку класса SimpleTest и его запуск из основного потока.

...