2013-07-02 24 views
13

Tôi mới sử dụng công nghệ Java. Tôi biết rằng chỉ có hai cách để tạo Thread trong JavaCách chủ đề chính được tạo bởi Java

  • Mở rộng lớp Thread
  • Thực hiện giao diện Runnable

Vì vậy, đây là chỉ có hai cách để tạo Thread. Nhưng khi chúng tôi bắt đầu Chương trình của chúng tôi với JVM chính, hãy bắt đầu một chính Thread. Tôi nghĩ ngay cả JVM cũng phải tuân theo quy tắc tạo chính Thread có nghĩa là tạo JVM chủ đề chính hoặc phải mở rộng lớp Thread hoặc thực hiện Runnable.

public class MainThreadExample { 

    public static void main(String[] args) { 

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

Tôi đã cố gắng hết mức nhưng không thể biết JVM đã tạo đối tượng chính này như thế nào. Khi tôi hoàn toàn trải qua lớp học chính (sun.tool.jar), tôi biết đây là lớp chịu trách nhiệm về chuỗi chính. Nhưng sau khi tìm kiếm rất nhiều trang web trong Google không thể có được nó. Vì vậy, xin vui lòng giúp đỡ và nếu có thể giới thiệu cho tôi ví dụ hoặc liên kết cũng có.

P.S: Tôi đang học công nghệ Java, tôi không nên bận tâm về cách chúng tạo ra chính và tất cả đó là một điều thiết kế. Nhưng tôi nghĩ câu hỏi hợp lý của nó là yêu cầu

+1

Tôi đoán đó là một phân lớp ẩn danh của 'Chủ đề' –

+0

' t.getClass(). GetFullName() 'nói gì? –

+0

không có quy tắc nào nếu chúng ta không thấy Runnable và Thread guys nên không có bất kỳ luồng nào, một phương thức sẽ được kích hoạt bởi một luồng, bạn cũng có thể chạy từng chuỗi bằng cách phản chiếu trong khi chúng không phải là một khoảng trống() , JVM tạo ra một thread và bên trong thread gọi phương thức main –

Trả lời

16

Ví dụ của java.lang.Thread không phải là một chủ đề; nó có thể được sử dụng để biểu diễn một luồng thực thi trong JVM nhưng JVM hoàn toàn có khả năng tạo các luồng mà không sử dụng lớp Thread.

Đây là những gì xảy ra với luồng chính: JVM tạo ra nó và một phiên bản java.lang.Thread được tạo để đại diện cho nó sau này.

Trong JVM Hotspot có rất nhiều luồng liên quan đến mã trong lớp Threads được xác định trong src/share/vm/runtime/thread.hppsrc/share/vm/runtime/thread.cpp. Việc khởi động JVM gọi hàm tĩnh Threads::create_vm, hiện đang chạy trong một chuỗi được thiết lập bởi hệ điều hành. Trong chức năng đó, chúng tôi tìm thấy:

(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(); 

Lớp JavaThread được sử dụng để ghi sổ kế toán; nó kết hợp một hệ điều hành hoặc máy chủ VM với một đối tượng Java Thread. Đối tượng Java dường như chưa tồn tại. Mã này sau đó tiếp tục khởi tạo những thứ khác nhau, và sau này vẫn còn trong chức năng tương tự, chúng tôi tìm thấy điều này:

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); 

Nói cách khác, chúng ta nó khởi sự System, ThreadGroup, và Thread lớp, sau đó tạo ra một thể hiện của Thread được tham chiếu bởi thread_object (dòng 3342) và đặt ví dụ Thread cho chính JavaThread.

Nếu bạn tự hỏi những gì create_initial_thread không, rõ ràng là nó phân bổ dụ Chủ đề, lưu trữ một con trỏ đến JavaThread (C++) đối tượng trong tin eetop lĩnh vực thẩm Chủ đề, thiết lập trường ưu tiên thread lại bình thường, gọi là Thread(ThreadGroup group,String name) hàm tạo và trả về cá thể:

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 } 

Bây giờ, đây là những gì mà Hotspot VM thực hiện. Các triển khai khác, như IBM J9, Oracle JRockit, hoặc Azul Zing có thể làm điều tương tự.

+0

Cảm ơn bạn rất nhiều vì đã trả lời Joni.But bạn có thể vui lòng giải thích một chút về cách Java đã tạo ra cá thể Java.lang.Thread đó để biểu diễn nó. Tôi đã đi qua toàn bộ chính và Chủ đề lớp nhưng không nhận được nó – Arun

+0

Chủ đề chính và đối tượng 'java.lang.Thread' đại diện cho nó phải được tạo trong mã gốc. Tôi sẽ xem xét các nguồn OpenJDK, có lẽ tôi có thể xác định vị trí. – Joni

+0

Đó sẽ là trợ giúp tuyệt vời .. Cảm ơn bạn đã rất nhiều vì đã giúp đỡ – Arun

3

Tôi tin rằng cơ chế chính xác là JVM cụ thể. Các thông số kỹ thuật là một chút mơ hồ, nhưng Thread Javadoc cung cấp như sau:

Khi một Java Virtual Machine khởi động, thường có một sợi phi-daemon duy nhất (mà thường gọi là phương thức có tên main của một số lớp được chỉ định) .

Cách bản đồ này thành một thể hiện của lớp Thread dường như không được chỉ định.

+0

Khi bạn nói "các thông số kỹ thuật hơi mơ hồ", phần nào của JLS/JVMS bạn đang đề cập đến? – Pacerier

Các vấn đề liên quan