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

首頁 > 編程 > Java > 正文

初步學習Java中線程的實現與生命周期

2019-11-26 14:52:21
字體:
來源:轉載
供稿:網友

線程的實現
  在Java中通過run方法為線程指明要完成的任務,有兩種技術來為線程提供run方法:

  1.繼承Thread類并重寫它的run方法。之后創建這個子類的對象并調用start()方法。

  2.通過定義實現Runnable接口的類進而實現run方法。這個類的對象在創建Thread的時候作為參數被傳入,然后調用start()方法。

 

  Thread類是專門用來創建線程和對線程進行操作的類。當某個類繼承了Thread類之后,該類就叫做一個線程類。

  兩種方法均需執行線程的start()方法為線程分配必須的系統資源、調度線程運行并執行線程的run()方法。

  start()方法是啟動線程的唯一的方法。start()方法首先為線程的執行準備好系統資源,然后再去調用run()方法。一個線程只能啟動一次,再次啟動就不合法了。

  run()方法中放入了線程的工作,即我們要這個線程去做的所有事情。缺省狀況下run()方法什么也不做。

  在具體應用中,采用哪種方法來構造線程要視情況而定。通常,當一個線程已經繼承了另一個類時,就應該用第二種方法來構造,即實現Runnable接口。

  下面給出兩個例子來說明線程的兩種實現方法,每個例子中都有兩個線程:/

public class ThreadTest1{  public static void main(String[] args)  {    Thread1 thread1 = new Thread1();    Thread2 thread2 = new Thread2();    thread1.start();    thread2.start();  }}class Thread1 extends Thread{  @Override  public void run()  {    for (int i = 0; i < 100; ++i)    {      System.out.println("Hello World: " + i);    }  }}class Thread2 extends Thread{  @Override  public void run()  {    for (int i = 0; i < 100; ++i)    {      System.out.println("Welcome: " + i);    }  }}public class ThreadTest2{  public static void main(String[] args)  {    // 線程的另一種實現方法,也可以使用匿名的內部類    Thread thread1 = new Thread(new MyThread1());    thread1.start();    Thread thread2 = new Thread(new MyThread2());    thread2.start();  }}class MyThread1 implements Runnable{  @Override  public void run()  {    for (int i = 0; i < 100; ++i)    {      System.out.println("Hello: " + i);    }  }}class MyThread2 implements Runnable{  @Override  public void run()  {    for (int i = 0; i < 100; ++i)    {      System.out.println("Welcome: " + i);    }  }}

Thread類剖析
  Thread類也實現了Runnable接口,因此實現了接口中的run()方法。

  當生成一個線程對象時,如果沒有為其指定名字,那么線程對象的名字將使用如下形式:Thread-number,該number是自動增加的數字,并被所有的Thread對象所共享,因為它是一個static的成員變量。

  當使用第一種方式(繼承Thread的方式)來生成線程對象時,我們需要重寫run()方法,因為Thread類的run()方法此時什么事情也不做。

  當使用第二種方式(實現Runnable接口的方式)來生成線程對象時,我們需要實現Runnable接口的run()方法,然后使用new Thread(new MyRunnableClass())來生成線程對象(MyRunnableClass已經實現了Runnable接口),這時的線程對象的run()方法會調用MyRunnableClass的run()方法。

 
停止線程
  線程的消亡不能通過調用stop()命令,而是讓run()方法自然結束。stop()方法是不安全的,已經廢棄。

  停止線程推薦的方式:設定一個標志變量,在run()方法中是一個循環,由該標志變量控制循環是繼續執行還是跳出;循環跳出,則線程結束。

  如代碼例子中所示:

public class ControlThreadTest{  MyThreadClass r = new MyThreadClass();  Thread t = new Thread(r);  public void startThread()  {    t.start();  }  public void stopThread()  {    r.stopRunning();  }}class MyThreadClass implements Runnable{  private boolean flag = true;  @Override  public void run()  {    while (flag)    {      System.out.println("Do something.");    }  }  public void stopRunning()  {    flag = false;  }}

線程的生命周期及優先級
線程的生命周期
  線程的生命周期:一個線程從創建到消亡的過程。

  如下圖,表示線程生命周期中的各個狀態:

201511792305306.png (862×383)

線程的生命周期可以分為四個狀態:

1.創建狀態:

  當用new操作符創建一個新的線程對象時,該線程處于創建狀態。

  處于創建狀態的線程只是一個空的線程對象,系統不為它分配資源。

  

2.可運行狀態:

  執行線程的start()方法將為線程分配必須的系統資源,安排其運行,并調用線程體――run()方法,這樣就使得該線程處于可運行狀態(Runnable)。

  這一狀態并不是運行中狀態(Running),因為線程也許實際上并未真正運行。

  

3.不可運行狀態:

  當發生下列事件時,處于運行狀態的線程會轉入到不可運行狀態:

  調用了sleep()方法;

  線程調用wait()方法等待特定條件的滿足;

  線程輸入/輸出阻塞。

  返回可運行狀態:

  處于睡眠狀態的線程在指定的時間過去后;

  如果線程在等待某一條件,另一個對象必須通過notify()或notifyAll()方法通知等待線程條件的改變;

  如果線程是因為輸入輸出阻塞,等待輸入輸出完成。

  

4.消亡狀態:

  當線程的run()方法執行結束后,該線程自然消亡。

 
線程的優先級
  1.線程的優先級及設置

  線程的優先級是為了在多線程環境中便于系統對線程的調度,優先級高的線程將優先執行。

  一個線程的優先級設置遵從以下原則:

  線程創建時,子繼承父的優先級。

  線程創建后,可通過調用setPriority()方法改變優先級。

  線程的優先級是1-10之間的正整數。

  1- MIN_PRIORITY

  10-MAX_PRIORITY

  5-NORM_PRIORITY

  如果什么都沒有設置,默認值是5。

  但是不能依靠線程的優先級來決定線程的執行順序。

 

  2.線程的調度策略

  線程調度器選擇優先級最高的線程運行。但是,如果發生以下情況,就會終止線程的運行:

  線程體中調用了yield()方法,讓出了對CPU的占用權。

  線程體中調用了sleep()方法,使線程進入睡眠狀態。

  線程由于I/O操作而受阻塞。

  另一個更高優先級的線程出現。

  在支持時間片的系統中,該線程的時間片用完。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 中牟县| 五河县| 阳泉市| 淮阳县| 都兰县| 通州市| 云阳县| 宝坻区| 舒兰市| 扎兰屯市| 微山县| 抚松县| 晋中市| 九龙城区| 新源县| 黄山市| 乐山市| 溧阳市| 柳林县| 广灵县| 松阳县| 东兰县| 扎兰屯市| 鄄城县| 瑞丽市| 瓦房店市| 喀喇沁旗| 出国| 龙井市| 九寨沟县| 阆中市| 太仆寺旗| 新和县| 简阳市| 海盐县| 通城县| 绥棱县| 德昌县| 廉江市| 那曲县|