說在前面,通過一段學習事後,本身發覺線程在Java中佔有舉足輕重的地位,總以爲如此複雜的線程知識點必定要好好理清纔好消化,於是有了這篇文章。java
但因鄙人資歷尚淺,若有遺漏錯誤之處還請廣大網友不吝賜教。編程
——————————————————————————我是分割線———————————————————————————————————————瀏覽器
首先讓咱們來梳理一下知識點,理清好脈絡纔好作題!多線程
咱們先來了解一下什麼是線程。併發
要解釋線程,就必須明白什麼是進程,那什麼是進程呢?若是學過操做系統的同窗應該知道:ide
進程是指運行中的應用程序,每一個進程都有本身獨立的地址空間(內存空間),好比用戶點擊桌面的IE瀏覽器,就啓動了一個進程,操做系統就會爲該進程分配獨立的地址空間。當用戶再次點擊左面的IE瀏覽器,又啓動了一個進程,操做系統將爲新的進程分配新的獨立的地址空間。目前操做系統都支持多進程。學習
要點:用戶每啓動一個進程,操做系統就會爲該進程分配一個獨立的內存空間。請注意是獨立的內存空間。this
在明白進程後,就比較容易理解線程的概念。spa
線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程本身不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的所有資源。一個線程能夠建立和撤消另外一個線程,同一進程中的多個線程之間能夠併發執行。線程有就緒、阻塞和運行三種基本狀態。操作系統
線程的特色:
一、線程是輕量級的進程
二、線程沒有獨立的地址空間(內存空間)
三、線程是由進程建立的(寄生在進程)
四、一個進程能夠擁有多個線程-->這就是咱們常說的多線程編程
五、線程有幾種狀態:
a、新建狀態(new)
b、就緒狀態(Runnable)
c、運行狀態(Running)
d、阻塞狀態(Blocked)
e、死亡狀態(Dead)
Just like this!
BINGO!
剛纔咱們講到了線程的四大特色,其中最後一條是說一個進程中能夠包含多條線程,咱們稱這樣的線程叫多線程。
那麼問題來了,
什麼是多線程呢?
若是在一個進程中同時運行了多個線程,用來完成不一樣的工做,則稱之爲「多線程」。
其中最值得咱們注意的是:多個線程其實是交替佔用CPU資源,而非咱們表面看起來的並行執行。
多線程的好處
好了,瞭解了基本知識點以後咱們來介紹介紹Java中有關線程建立經常使用到的類
線程的建立
首當其衝的要說的即是咱們的Thread類
Java提供了java.lang.Thread類支持多線程編程
這是一種最簡單的建立線程的方法,值得注意的是這裏的類是繼承了Thread父類的。
public class ThreadDemo extends Thread{ @Override public void run() { for(int i=0;i<=20;i++){ System.out.println(i+".你好,來自線程"+ Thread.currentThread().getName()); } } public static void main(String[]args){ ThreadDemo t1=new ThreadDemo(); t1.start();//線程的啓動方法 ThreadDemo t2=new ThreadDemo(); t2.start(); } }
直接new明顯是一個簡單快捷的辦法,但有時候咱們爲了傳入某種參數或是爲了約束對象類型每每會在new ***()中加入咱們的參數或類型名稱,這些也是應當掌握的,在稍後面的代碼中會有關於這一現象的描述。
除了使用直接繼承Thread類之外,咱們還能夠定義MyRunnable類實現Runnable接口,而後完成如下四步操做便可
public class RunnableDemo implements Runnable { @Override public void run() { for(int i=0;i<=100;i++){ System.out.println(Thread.currentThread().getName()+"-->"+i); } } public static void main(String[] args) { RunnableDemo rd1=new RunnableDemo(); Thread t1=new Thread(rd1); t1.start(); RunnableDemo rd2=new RunnableDemo(); Thread t2=new Thread(rd2); t2.start(); } }
看起來是否是比Thread類更復雜一點呢,其實也就是在new完RunnableDemo以後還要將這一新建對象放進Thread方法中。
那麼,這二者的區別又是什麼呢?
1、繼承Thread類
編寫簡單,可直接操做線程
適用於單繼承
2、實現Runnable接口
避免單繼承侷限性
便於共享資源
雖然建立了諸多線程,可是若是沒有主線程的運行仍然只是一條沒有夢想的鹹魚(笑)
主線程
main()方法即爲主線程入口
產生其餘子線程的線程
必須最後完成執行,由於它執行各類關閉動做
好了,有了主線程的幫助,咱們的線程終於可以跑起來了,但會不會有其餘的異常出現,或者還有沒有其餘更復雜的線程實例,
因爲學習上的其餘事情,我決定下次有時間再寫,歡迎關注我,我將持續更新學習進度!作一個有夢想的鹹魚!
——————————————————未完待續——————————————————————————————————