Java線程及生命週期

Java5以後線程狀態放到了Thread.State中,分別是:java

  • new:就緒狀態,表示線程被建立出來尚未啓動。
  • Runnabel:就緒狀態,線程執行須要對應的計算資源,此時線程可能正在執行,也可能在等待CPU調度。
  • Blocked:阻塞狀態,表示線程在等待持有Monitor鎖,若是此時鎖被其餘線程搶佔,則當前線程進入阻塞狀態。
  • Waiting:等待狀態,表示執行狀態還沒有知足在等待其餘線程的針對性操做,好比notify等操做。
  • Terminated:終止狀態,意外退出或者,線程執行完成。

在操做系統中線程是最小的調度單元,進程中能夠建立多個線程,線程中有本身的棧,寄存器,本地存儲,會和進程內其餘線程共享文件描述符,虛擬地址。golang

目前jdk中調度的線程會一一映射到操做系統的內核線程上,jdk經過JNI調用本地代碼。併發

最近幾年golang的協程很火,相信過不了多久java也會出現這樣一款輕量級併發解決方案了。jvm

建立線程有Runable和繼承Thread兩種方式,其實底層是一種方式基於Runable的,好處是解決了Java類不支持多重繼承的限制,能夠重用代碼邏輯。spa

Jdk層面對於線程的調度,能夠採用yield讓線程讓出cpu,調用wait告訴持有monitor鎖的線程進入等待狀態。操作系統

當咱們啓動一個hello word時,能夠經過MXBean觀察啓動的線程,觀察他們的不一樣目的:線程

  • main:主線程。
  • Reference Handler:對引用對象進行垃圾回收的線程。
  • Finalizer:處理用戶的Finalizer方法。
  • Signal Dispatcher:接收jvm外部命令,命令轉發器。
  • Attach Listerner:負責接收jstack,jmap的命令。
相關文章
相關標籤/搜索