欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

初步學習Java中線程的實現(xiàn)與生命周期

 更新時間:2015年11月07日 09:25:22   作者:圣騎士Wind的博客  
這篇文章主要介紹了初步學習Java中線程的實現(xiàn)與生命周期,線程方面的知識是Java學習過程中的重點和難點,需要的朋友可以參考下

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

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

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

 

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

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

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

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

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

  下面給出兩個例子來說明線程的兩種實現(xiàn)方法,每個例子中都有兩個線程:\

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)
  {
    // 線程的另一種實現(xiàn)方法,也可以使用匿名的內部類
    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類也實現(xiàn)了Runnable接口,因此實現(xiàn)了接口中的run()方法。

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

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

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

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

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

  如代碼例子中所示:

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;
  }

}

線程的生命周期及優(yōu)先級
線程的生命周期
  線程的生命周期:一個線程從創(chuàng)建到消亡的過程。

  如下圖,表示線程生命周期中的各個狀態(tài):

201511792305306.png (862×383)

線程的生命周期可以分為四個狀態(tài):

1.創(chuàng)建狀態(tài):

  當用new操作符創(chuàng)建一個新的線程對象時,該線程處于創(chuàng)建狀態(tài)。

  處于創(chuàng)建狀態(tài)的線程只是一個空的線程對象,系統(tǒng)不為它分配資源。

  

2.可運行狀態(tài):

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

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

  

3.不可運行狀態(tài):

  當發(fā)生下列事件時,處于運行狀態(tài)的線程會轉入到不可運行狀態(tài):

  調用了sleep()方法;

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

  線程輸入/輸出阻塞。

  返回可運行狀態(tài):

  處于睡眠狀態(tài)的線程在指定的時間過去后;

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

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

  

4.消亡狀態(tài):

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

 
線程的優(yōu)先級
  1.線程的優(yōu)先級及設置

  線程的優(yōu)先級是為了在多線程環(huán)境中便于系統(tǒng)對線程的調度,優(yōu)先級高的線程將優(yōu)先執(zhí)行。

  一個線程的優(yōu)先級設置遵從以下原則:

  線程創(chuàng)建時,子繼承父的優(yōu)先級。

  線程創(chuàng)建后,可通過調用setPriority()方法改變優(yōu)先級。

  線程的優(yōu)先級是1-10之間的正整數(shù)。

  1- MIN_PRIORITY

  10-MAX_PRIORITY

  5-NORM_PRIORITY

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

  但是不能依靠線程的優(yōu)先級來決定線程的執(zhí)行順序。

 

  2.線程的調度策略

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

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

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

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

  另一個更高優(yōu)先級的線程出現(xiàn)。

  在支持時間片的系統(tǒng)中,該線程的時間片用完。

相關文章

  • java中線程的狀態(tài)學習筆記

    java中線程的狀態(tài)學習筆記

    在本文里我們給大家整理了關于java中線程的狀態(tài)的相關知識點內容,對此有需要的朋友們學習參考下。
    2019-03-03
  • Java加載資源文件時的路徑問題的解決辦法

    Java加載資源文件時的路徑問題的解決辦法

    今天偶然看到一篇關于tomcat加載servlet的文章,不由得想起了java加載資源文件的路徑問題,資源文件可以使xml,properties,圖片等,可以是任何文件
    2013-04-04
  • 深入解析Java的包(package)

    深入解析Java的包(package)

    這篇文章主要介紹了深入解析Java的包(package),是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法

    IntelliJ IDEA 無法正常使用SVN的問題和完美解決辦法

    這篇文章主要介紹了IntelliJ IDEA 無法正常使用SVN的問題和解決辦法,本文給大家分享完美解決方案,通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 深入了解Java8中的時區(qū)日期時間

    深入了解Java8中的時區(qū)日期時間

    Java?在?java.time?包中也提供了幾個類用于處理需要關注時區(qū)的日期時間?API,本文將通過簡單的示例講講它們的用法,需要的可以參考一下
    2023-04-04
  • 帶有@Transactional和@Async的循環(huán)依賴問題的解決

    帶有@Transactional和@Async的循環(huán)依賴問題的解決

    這篇文章主要介紹了帶有@Transactional和@Async的循環(huán)依賴問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • El表達式使用問題javax.el.ELException:Failed to parse the expression的解決方式

    El表達式使用問題javax.el.ELException:Failed to parse the expression

    今天小編就為大家分享一篇關于Jsp El表達式使用問題javax.el.ELException:Failed to parse the expression的解決方式,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot入門系列之JPA mysql

    SpringBoot入門系列之JPA mysql

    這篇文章主要介紹了SpringBoot入門系列之JPA mysql的相關資料,需要的朋友可以參考下
    2017-04-04
  • JDBC Template基本使用方法詳解

    JDBC Template基本使用方法詳解

    這篇文章主要介紹了JDBC Template基本使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 全方位解析key值不確定的json數(shù)據(jù)

    全方位解析key值不確定的json數(shù)據(jù)

    這篇文章主要介紹了全方位解析key值不確定的json數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論