java線程學習,java線程

來源:互聯網
上載者:User

java線程學習,java線程

一、線程的建立

  java中建立線程有兩種方式:繼承Thread類和實現Runnable介面。

  1.繼承Thread類

  Java語言中定義了線程類Thread,使用者可以通過繼承Thread類,覆蓋其run()方法建立自己的線程類,線程執行的代碼都包含在run方法中。

  public ClassName extends Thread{

    public void run(){

    }

  }

  2.實現Runnable介面

  另一種線程的實現方式是實現Runnable介面。如果自訂的線程還要繼承其他類,這時就不能採用第一種方式來建立,java語言是不支援多繼承的,卻可以實現多個介面,線程同樣要實現Runnable介面中的run方法,線程需要執行的代碼都包含在run方法中。

  Class MyThread implements Runnable{

    public void run(){

    }

  }

二、線程的啟動

  繼承Thread類方式的線程啟動非常簡單,只要建立線程類執行個體後調用其start()方法用來完成線程的啟動。

  ClassName c = new ClassName();

  c.start();

  實現Runnable介面建立的線程首先轉換為Thread類,然後調用Thread類的start()方法啟動線程。

  MyThread  mt = new MyThread();

  Thread t = new Thread(mt);

  t.start();

三、線程的生命週期

  一個生命週期內的線程主要包括建立、就緒、運行、阻塞和死亡狀態。

  1.建立:線上程類使用new關鍵字執行個體化之後在調用start()方法之前,線程處於建立狀態。處於建立狀態的線程僅僅分配了記憶體空間,屬於生命週期的初始狀態。

  2.就緒:線上程調用了start()方法後即處於就緒狀態。處於就緒狀態的線程具備了除CPU之外運行所需的所有資源。就緒狀態線程排隊等待CPU,由系統調度為其分配。

  3.運行:處於就緒狀態的線程獲得CPU之後即處於運行狀態。處於運行狀態的線程才開始正真執行線程run()方法的內容。

  4.阻塞:處於運行狀態的線程如果因為某種原因不能繼續執行,則進入阻塞狀態。阻塞狀態與就緒狀態不同的是:就緒狀態只是因為缺少CPU而不能執行,而阻塞狀態是由於各種原因引起線程不能執行,不僅僅是缺少CPU。引起阻塞的原因解除之後,線程再次轉化為就緒狀態。

  5.死亡:當線程執行完run()方法的內容或被強制終止時,線程處於死亡狀態,整個生命週期結束。

四、線程的調度

  1.線程的優先順序:在java語言中,通過調用setPriority()方法為線程設定優先權,優先順序用1~10的數字表示,數字越大,優先順序越高。如:c.setPriority(1),接著再啟動線程。

  2.線程休眠:對於正在執行的線程,可以調用sleep()方法使其放棄CPU進行休眠,此線程轉為阻塞狀態,sleep()方法包含long型的參數,用於指定線程休眠的時間,單位為毫秒。

  3.線程讓步:對於正在執行的線程,可以調用yield方法使其重新排隊,將CPU讓給排在後面的線程,此線程轉為就緒狀態。yield()方法只讓步給高優先順序或同等優先順序的線程。

  4.線程等待:對於正在執行的線程,可以調用join()方法等待其結束,然後才執行其他程式。

    如:c.start();

      c.join();

      t.start;

  等待c線程執行完成再執行t.

五、線程同步

  當多個線程操作同一個共用資源時,比如讀寫同一個變數,存在著資源競爭的問題。為瞭解決此類問題,需要使用同步機制。在java語言中,利用synchronized關鍵字實現線程同步。

  執行個體如下:

class MyThread implements Runnable{
  private int con = 0;

  @Override
  public void run() {
    test();
  }
  private void test(){
    for(int i = 0;i<10;i++){
      con++;
      Thread.yield();
      con--;
      System.out.println(con);
    }
  }
}

public class testThread {
  public static void main(String[] args) {
    MyThread t = new MyThread();
    Thread t1 = new Thread(t);
    Thread t2= new Thread(t);

    t1.start();
    t2.start();
}
}

結果如下:

0
0
0
0
0
0
1
0
0
1
0
1

調整如下:

class MyThread implements Runnable{
  private int con = 0;

  @Override
  public void run() {
    test();
  }
  private synchronized void test(){
    for(int i = 0;i<10;i++){
      con++;
      Thread.yield();
      con--;
      System.out.println(con);
    }
  }
}

public class testThread {
  public static void main(String[] args) {
    MyThread t = new MyThread();
    Thread t1 = new Thread(t);
    Thread t2= new Thread(t);

    t1.start();
    t2.start();
  }
}

輸出的結果全為0.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.