JAVA 多執行緒--瞭解執行緒
阿新 • • 發佈:2018-12-25
想要學習執行緒,首先要了解程序。
在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。每一個程式對應一個程序,執行緒是程序內的可排程實體。程序是獨佔資源的,程序內的執行緒共享程序的資源。
為什麼要有執行緒?
執行緒是為了更好的利用程序內的資源。提高CPU利用率。CPU是以執行緒為執行單位的,執行緒對程序的切分與細化,提高了程序內的資源利用率。
為什麼存線上程安全問題?
如果你的程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題。
執行緒安全問題都是由全域性變數及靜態變數引起的。
若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數是執行緒安全的;若有多個執行緒同時執行寫操作,一般都需要考慮執行緒同步,否則的話就可能影響執行緒安全。
那執行緒到底在哪裡?
在敲執行緒demo的時候,總是例項化一個或多個Thread類,來實現開啟多個執行緒。那如果我們不例項化這個類就不開啟執行緒了嗎? java類都有一個預設的main方法,當我們執行main方法的時候,就開啟了一個執行緒。 Thread.currentThread():獲取當前的執行緒。public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { System.err.println("最早的執行緒"+Thread.currentThread().getName()); }
}
顯示結果如下圖所示:兩個類之間的呼叫:
public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { System.err.println("最早的執行緒"+Thread.currentThread().getName()); /*new TraditionalThreadSynchronized().init();*/ TimerTest timerTest=new TimerTest(); timerTest.showResult(); } }
public class TimerTest {
public void showResult()
{
System.err.println("呼叫TimerTest類:"+Thread.currentThread().getName());
}
}
當main為我們開啟了一個main執行緒之後,如果不手動開啟執行緒,基本不會再開啟執行緒。一直在查詢我們平常開發的專案沒有呼叫main方法,是誰開啟的執行緒呢?沒有找到結果,猜測一下,應該是tomcat伺服器開啟的,我們的每一次請求,都會開啟一個執行緒。