java.lang.Thread
のインスタンスはスレッドではありません。 JVMで実行スレッドを表すために使用できますが、JVMは、Thread
クラスをまったく使用せずにスレッドを完全に作成することができます。
メインスレッドではこれが起こります.JVMがそれを作成し、java.lang.Thread
のインスタンスが作成され、後でそれが表現されます。
ホットスポットJVMにはsrc/share/vm/runtime/thread.hpp
とsrc/share/vm/runtime/thread.cpp
で定義されたThreads
クラスのスレッディング関連のコードがたくさんあります。 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
クラスは明らかに簿記のために使用されています。 OSスレッドまたはVMスレッドをJavaスレッドオブジェクトに関連付けます。 Javaオブジェクトは明らかにまだ存在しません。その後、インスタンスを作成し、我々はそれがSystem
、ThreadGroup
、およびThread
クラスを初期化し、他の言葉で
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);
:コードは、その後、我々はこれを見つけると同じ機能で、まだ後に様々な他のものを初期化し、しに行きますthread_object
(行3342)によって参照されるThread
のインスタンスであり、JavaThread
のインスタンスをThread
に設定します。
あなたはcreate_initial_thread
が何をするか疑問に思う場合は、どうやらそれは、スレッドのインスタンスを割り当てスレッドインスタンスのプライベートeetop
分野でJavaThread
(C++)オブジェクトへのポインタを格納し、正常な状態にスレッド優先順位フィールドを設定し、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のような他の実装もおそらく同様のことをします。
'Thread'の匿名サブクラスだと思います。 –
' t.getClass()。getFullName() 'とは何ですか? –
RunnableとThreadの人が見えないのでスレッドがない場合、メソッドはスレッドによって起動されますが、voidスレッドではない間にすべてのスレッドをリフレクションで実行できるというルールもありません() JVMがスレッドを作成し、スレッド内でmainメソッドを呼び出す –