Как основной поток, созданный Java - программирование

Как основной поток, созданный Java

Я новичок в технологии Java. Я знаю, что существует только два способа создания Thread в Java

  • Расширение класса Thread
  • Внедрение Runnable Interface

Итак, это всего лишь два способа создания Thread. Но когда мы запускаем нашу Программу с главной JVM, мы создали один из основных Thread. Я думаю, что даже JVM должна следовать правилу для создания основных Thread средств для создания основного потока. JVM либо должен расширять класс Thread, либо реализовать Runnable.

public class MainThreadExample {

    public static void main(String[] args) {

        Thread t=Thread.currentThread();            
        System.out.println(t.getName());            
    }
}

Я пробовал свой уровень лучше, но не смог узнать, как JVM создал этот главный объект. Поскольку я полностью прошел основной класс (sun.tool.jar), я знаю, что это класс, который отвечает за основной поток. Но после поиска столько веб-страниц в Google, которые не могут его получить. Поэтому, пожалуйста, помогите, и, если возможно, напишите мне пример или ссылку.

P.S: Я изучаю технологию Java, я не должен был беспокоиться об этом, как они создали основную, и все это проектирование. Но я думаю, что его логический вопрос, чтобы спросить

4b9b3361

Ответ 1

Экземпляр java.lang.Thread не является нитью; он может использоваться для представления потока выполнения в JVM, но JVM отлично способен создавать потоки без использования класса Thread вообще.

Это то, что происходит с основным потоком: JVM создает его, и создается экземпляр java.lang.Thread для его представления позже.

В JVM Hotspot существует много связанных с потоками кода в классе Threads, определенном в src/share/vm/runtime/thread.hpp и src/share/vm/runtime/thread.cpp. Запуск JVM вызывает статическую функцию Threads::create_vm, которая уже запущена в потоке, настроенном операционной системой. Внутри этой функции мы находим:

(src/share/vm/runtime/thread.cpp)
3191   // Attach the main thread to this os thread
3192   JavaThread* main_thread = new JavaThread();
3193   main_thread->set_thread_state(_thread_in_vm);
3194   // must do this before set_active_handles and initialize_thread_local_storage
3195   // Note: on solaris initialize_thread_local_storage() will (indirectly)
3196   // change the stack size recorded here to one based on the java thread
3197   // stacksize. This adjusted size is what is used to figure the placement
3198   // of the guard pages.
3199   main_thread->record_stack_base_and_size();
3200   main_thread->initialize_thread_local_storage();

Класс JavaThread, по-видимому, используется для ведения бухгалтерского учета; он связывает поток ОС или VM с объектом Java Thread. Объект Java, по-видимому, еще не существует. Затем код переходит к инициализации других вещей, а затем по-прежнему в той же функции мы находим это:

3335     // Initialize java_lang.System (needed before creating the thread)
3336     if (InitializeJavaLangSystem) {
3337       initialize_class(vmSymbols::java_lang_System(), CHECK_0);
3338       initialize_class(vmSymbols::java_lang_ThreadGroup(), CHECK_0);
3339       Handle thread_group = create_initial_thread_group(CHECK_0);
3340       Universe::set_main_thread_group(thread_group());
3341       initialize_class(vmSymbols::java_lang_Thread(), CHECK_0);
3342       oop thread_object = create_initial_thread(thread_group, main_thread, CHECK_0);
3343       main_thread->set_threadObj(thread_object);
3344       // Set thread status to running since main thread has
3345       // been started and running.
3346       java_lang_Thread::set_thread_status(thread_object,
3347                                           java_lang_Thread::RUNNABLE);

Иными словами, мы инициализируем классы System, ThreadGroup и Thread, затем создаем экземпляр Thread, на который ссылается thread_object (строка 3342), и устанавливает экземпляр Thread для основного JavaThread.

Если вам интересно, что делает create_initial_thread, по-видимому, он выделяет экземпляр Thread, сохраняет указатель на объект JavaThread (С++) в приватном поле eetop экземпляра Thread, задает поле приоритета потока normal, вызывает конструктор Thread(ThreadGroup group,String name) и возвращает экземпляр:

 967 // Creates the initial Thread
 968 static oop create_initial_thread(Handle thread_group, JavaThread* thread, TRAPS) {
 969   klassOop k = SystemDictionary::resolve_or_fail(vmSymbols::java_lang_Thread(), true, CHECK_     NULL);
 970   instanceKlassHandle klass (THREAD, k);
 971   instanceHandle thread_oop = klass->allocate_instance_handle(CHECK_NULL);
 972 
 973   java_lang_Thread::set_thread(thread_oop(), thread);
 974   java_lang_Thread::set_priority(thread_oop(), NormPriority);
 975   thread->set_threadObj(thread_oop());
 976 
 977   Handle string = java_lang_String::create_from_str("main", CHECK_NULL);
 978 
 979   JavaValue result(T_VOID);
 980   JavaCalls::call_special(&result, thread_oop,
 981                                    klass,
 982                                    vmSymbols::object_initializer_name(),
 983                                    vmSymbols::threadgroup_string_void_signature(),
 984                                    thread_group,
 985                                    string,
 986                                    CHECK_NULL);
 987   return thread_oop();
 988 }

Теперь это то, что делает Hotspot VM. Другие реализации, такие как IBM J9, Oracle JRockit или Azul Zing, вероятно, делают что-то подобное.

Ответ 2

Я считаю, что точная механика специфична для JVM. Спецификации немного расплывчаты, но Thread Javadoc предлагает следующее:

Когда запускается виртуальная машина Java, обычно существует один поток без демона (который обычно вызывает метод с именем main определенного назначенного класса).

Как это сопоставляется с экземпляром класса Thread, как представляется, не указано.