国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

java線程的基礎實例解析

2024-07-13 10:15:31
字體:
來源:轉載
供稿:網友

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線程的基礎實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜川县| 遂川县| 弋阳县| 泊头市| 绥江县| 滨海县| 鸡泽县| 清流县| 诏安县| 上虞市| 崇义县| 友谊县| 周宁县| 武城县| 饶河县| 洛扎县| 荣昌县| 海宁市| 河北省| 建昌县| 兴义市| 张家港市| 阜城县| 南郑县| 湟中县| 宁国市| 平利县| 青河县| 桐乡市| 呼伦贝尔市| 松滋市| 芦山县| 贡嘎县| 遂平县| 长葛市| 通城县| 牙克石市| 保德县| 罗源县| 江津市| 安乡县|