中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java線程基礎知識點有哪些

發布時間:2021-08-05 14:45:33 來源:億速云 閱讀:127 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關java線程基礎知識點有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

java中建立線程可以有兩種方式,分別是繼承Thread類和實現Runnable接口。

繼承Thread

public class MyThread extends Thread{ 
  public MyThread(String name){ 
   super(name); 
  } 
  int i; 
 public void run(){ 
  for(i=0;i<5;i++){ 
   System.out.println(getName()+"--"+i);   
  } 
 } 
 public static void main(String[] agrs){ 
  new MyThread("線程1").start(); 
  new MyThread("線程2").start(); 
 } 
} 
/*
線程1--0
線程1--1
線程1--2
線程1--3
線程1--4
線程2--0
線程2--1
線程2--2
線程2--3
線程2--4
*/

如上,java中的線程對象必須一個類的形式創建,而該類中必須重寫基類的run()方法,該方法其實就是線程的執行體。調用該類實例的start方法則就隱式的調用了run方法。

不難看出,由于new了2次MyThread,所以兩次的實例是不同的,即各自都有各自的i變量,相互獨立。

Runnable接口

public class MyRunnable implements Runnable{ 
 int i; 
 public void run(){ 
  for(i=0;i<50;i++){ 
   System.out.println(Thread.currentThread().getName()+"--"+i);//不能直接this.getName() 
  } 
 } 
 public static void main(String[] agrs){ 
  MyRunnable myRun=new MyRunnable(); 
  new Thread(myRun,"線程1").start(); 
  new Thread(myRun,"線程2").start(); 
 } 
} 
/*
線程1--0
線程1--1
線程2--0
線程2--3
線程2--4
線程2--5
線程2--6
線程2--7
線程2--8
線程2--9
線程2--10
線程2--11
線程2--12
線程2--13
線程2--14
線程2--15
線程1--2
線程2--16
線程2--18
線程2--19
線程2--20
線程2--21
線程2--22
線程2--23
線程2--24
線程1--17
線程2--25
線程1--26
線程2--27
線程1--28
線程1--30
線程2--29
線程1--31
線程2--32
線程2--34
線程2--35
線程2--36
線程2--37
線程1--33
線程2--38
線程1--39
線程1--41
線程2--40
線程1--42
線程1--44
線程1--45
線程2--43
線程1--46
線程2--47
線程2--49
線程1--48
*/

可以看出,由于實現這種方式是將某一個對象做為target加載到Thread類上,所以即使new再多的Thread對象,只要target是同一引用的對象,則就調用該對象的run方法,所有線程均共享該target對象的資源,所以會看到線程1和線程2一共輸出了51次,2條線程共同完成了i從0到49的輸出,而并不像上面那樣分別輸出5次。至于為什么輸出了51條,兩條線程幾乎在同一時刻進入就緒狀態(start方法只是讓線程進入就緒狀態),觀察上面的i變量不難發現當i等于0時,此時線程1和線程2均同時處于運行狀態,產生了并發現象,共同輸出了i=0,而此之后CPU通過不斷的切換線程,使得在同一時刻只有一條線程在輸出。

線程狀態

線程分為4個狀態

就緒狀態:調用start方法則進入就緒狀態。
運行狀態:處于就緒狀態的線程會被jvm進行調度從而成為運行狀態。
阻塞狀態:如有某些同步方法未返回結果則出現阻塞狀態,或sleep和yeild。
死亡狀態:方法體執行完畢或者強行stop某個線程。

線程的基本操作

join()合并線程:當前線程調用某線程的join方法后將會等待某線程執行完畢后本線程才會繼續。
sleep(long milliseconds)線程睡眠:阻塞當前線程,只有阻塞的時間到了才會繼續下去。再阻塞的同時,會將CPU占有權交給其他線程,所以常常利用sleep(1)來切換線程。
**yield()線程讓步:**yeild類似與sleep,但是它只會讓步于比自己級別高或者同級別的其他線程,若沒有其他線程均比自己級別低則再次執行本線程。

后臺線程

一個程序被操作系統執行后將有一個進程,一個進程至少有一個線程(主線程),主線程并沒有比其他線程有太多的特殊之處,只因為它是最早被執行的線程,在主線程中將會創建其他線程,若不指明則默認創建的是前臺線程(包括main線程),若調用setDaemon(true)則顯式的將該線程設置為后臺線程,后臺線程為Daemon線程,從名字就能看出,它的主要作用是為其他線程提供守護,服務的功能。當所有前臺線程結束后,后臺線程將會被強制結束,因為它此時已經沒有存在的意義了。

前臺線程

public class ForeAndBackThread extends Thread{ 
 public ForeAndBackThread(String name){ 
  super(name); 
 } 
 public void run(){       
  int i; 
  for(i=0;i<9999;i++){ 
   System.out.println(this.getName()+"--"+i); 
  } 
 } 
 public static void main(String[] args){ 
  ForeAndBackThread th=new ForeAndBackThread("線程A"); 
  //th.setDaemon(true); 
  th.start(); 
  int j; 
  for(j=0;j<3;j++){ 
   System.out.println(Thread.currentThread().getName()+"--"+j); 
  } 
 } 
}

程序完整的輸出子線程中0到9998;說明主線程并沒有什么特殊的,它的結束并不會影響其他前臺線程的運行。

后臺線程

public class ForeAndBackThread extends Thread{ 
 public ForeAndBackThread(String name){ 
  super(name); 
 } 
 public void run(){       
  int i; 
  for(i=0;i<9999;i++){ 
   System.out.println(this.getName()+"--"+i); 
  } 
 } 
 public static void main(String[] args){ 
  ForeAndBackThread th=new ForeAndBackThread("線程A"); 
  th.setDaemon(true); 
  th.start(); 
  int j; 
  for(j=0;j<3;j++){ 
   System.out.println(Thread.currentThread().getName()+"--"+j); 
  } 
 } 
}

程序并不能完整的輸出0-9998就退出了,說明前臺主線程結束后,jvm強制結束了后臺線程。

感謝各位的閱讀!關于“java線程基礎知識點有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南阳市| 奉贤区| 长岛县| 襄樊市| 章丘市| 台安县| 集安市| 古丈县| 黑河市| 札达县| 壶关县| 南乐县| 贵阳市| 吐鲁番市| 三门县| 高安市| 平昌县| 碌曲县| 太原市| 泰来县| 亳州市| 福清市| 巴彦县| 乾安县| 玉田县| 永寿县| 封开县| 齐齐哈尔市| 宝鸡市| 安仁县| 凌源市| 榕江县| 抚顺市| 抚州市| 西畴县| 商都县| 上林县| 夏河县| 梅河口市| 汉川市| 安塞县|