2013-07-02 11 views
13

Javaテクノロジが初めてです。私は Javaでメインスレッドを作成する方法

だから、これはThreadを作成するための唯一の二つの方法で、Runnableインタフェースを実装するJava

  • 拡張Threadクラス
  • Threadを作成するための唯一の二つの方法があることを知っています。しかし、メインJVMを使用してプログラムを開始すると、メインの1つであるThreadが開始されました。私は、JVMでもメインを作成するためのルールに従わなければならないと思いますThreadメインスレッドJVMを作成する手段は、スレッドクラスを拡張するか、Runnableを実装する必要があります。

    public class MainThreadExample { 
    
        public static void main(String[] args) { 
    
         Thread t=Thread.currentThread();    
         System.out.println(t.getName());    
        } 
    } 
    

    私のレベルは最善でしたが、JVMがこのメインオブジェクトをどのように作成したかを知ることができませんでした。私は完全にメインクラス(sun.tool.jar)を通過したので、私はこれがメインスレッドを担当するクラスであることを知っています。しかし、Googleの検索で多くのWebページを取得することができません。だから助けてください、可能であれば、例やリンクも私に紹介してください。

    P.S:私はJavaテクノロジを学んでいますが、これがメインをどのようにして作成したのかを気にするべきではありません。しかし、私はその論理的な質問をすると思う

+1

'Thread'の匿名サブクラスだと思います。 –

+0

' t.getClass()。getFullName() 'とは何ですか? –

+0

RunnableとThreadの人が見えないのでスレッドがない場合、メソッドはスレッドによって起動されますが、voidスレッドではない間にすべてのスレッドをリフレクションで実行できるというルールもありません() JVMがスレッドを作成し、スレッド内でmainメソッドを呼び出す –

答えて

16

java.lang.Threadのインスタンスはスレッドではありません。 JVMで実行スレッドを表すために使用できますが、JVMは、Threadクラスをまったく使用せずにスレッドを完全に作成することができます。

メインスレッドではこれが起こります.JVMがそれを作成し、java.lang.Threadのインスタンスが作成され、後でそれが表現されます。

ホットスポットJVMにはsrc/share/vm/runtime/thread.hppsrc/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オブジェクトは明らかにまだ存在しません。その後、インスタンスを作成し、我々はそれがSystemThreadGroup、および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のような他の実装もおそらく同様のことをします。

+0

Joniさんにお返事いただきありがとうございます。しかし、JavaがJavaをどのようにして作ったのか少し詳しくお試しいただけますか?lang.Threadインスタンスはそれを表現しています。スレッドクラスですが、それを取得しませんでした – Arun

+0

メインスレッドとそれを表す 'java.lang.Thread'オブジェクトはネイティブコードで作成しなければなりません。私はOpenJDKのソースを見ていきますが、多分私は場所を特定することができます。 – Joni

+0

お手伝いをしてくれてありがたいです – Arun

3

正確な仕組みはJVMに固有のものだと思います。スペックは少し曖昧ですが、Thread Javadocは以下を提供しています:

Java仮想マシンが起動すると、(典型的には、いくつかの指定されたクラスのmainという名前のメソッドを呼び出します)単一の非デーモンスレッドが通常あり。

Threadクラスのインスタンスへのマップ方法は指定されていません。

+0

「仕様が少し曖昧です」と言うと、JLS/JVMSのどの部分を指していますか? – Pacerier

関連する問題