<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # JAVA之旅(十二)——Thread,run和start的特點,線程運行狀態,獲取線程對象和名稱,多線程實例演示,使用Runnable接口 * * * > 開始挑戰一些難度了,線程和I/O方面的操作了,繼續堅持 ## 一.Thread > 如何在自定義的代碼中,自定義一個線程呢? ![這里寫圖片描述](http://img.blog.csdn.net/20160603195312386) > 我們查看API文檔,我們要啟動一個線程,先實現一個子類, ~~~ package com.lgl.hellojava; public class MyThread extends Thread { @Override public void run() { System.out.println("我是一個線程"); } } ~~~ > 我們要調用它的話,只需要start就可以 ~~~ MyThread thread = new MyThread(); thread.start(); ~~~ > 這樣就會執行我們的run方法 ![這里寫圖片描述](http://img.blog.csdn.net/20160603200131274) > 我們來理一下思路,線程有兩種創建方式,我們先將第一種: * 1.繼承Thread 類 * 2.復寫Thread類的run方法 * 3.調用線程的start方法? * 該方法有兩個作用,啟動線程和調用run方法 > 我們可以把代碼改一下 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); for (int i = 0; i < 1140; i++) { System.out.println("Hello JAVA"); } } } class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 1140; i++) { System.out.println("我是一個線程"); } } } ~~~ > 這樣輸出多少? ![這里寫圖片描述](http://img.blog.csdn.net/20160603200904954) > 你注意一下,他們交叉輸出了,這種,就是多線成,兩個線程同時在跑,都在獲取cpu的使用權,cpu執行到誰,誰就執行,明確一點,在某一個時刻,只能有一個程序在運行(多核除外),cpu在做著快速的切換以達到看上去是同時運行的效果 > > 我們可以形象的把多線成的運行,形容為在互相搶奪CPU的資源,那么這就是多線成的一個特性叫隨機性,誰搶到誰執行,但是執行多長,cpu說了算 ## 二.run和start的特點 > 為什么要覆蓋run方法 > > Thread類用于描述線程,該類就定義了一個功能,用于存儲線程要運行的代碼,該存儲功能就是run方法 > > 也就是說Thread類匯總的run方法是用于存儲線程執行的代碼 > > 目的:將自定義的代碼存儲在run方法中讓線程運行 ## 三.線程運行狀態 > 線程運行會有幾種狀態,我們要了解他的狀態,才能了解他運行的原理,我們先來看一張圖 ![這里寫圖片描述](http://img.blog.csdn.net/20160603213356335) > 我們一步步來分析,首先線程的第一種狀態是創建,你new一個線程就是被創建了,緊接著,就是運行的狀態,他們的過程,就是start,當然,線程還有一種為凍結,處于某一種狀態,就交凍結,他們通過sleep來交替。最后就是線程結束了,通過stop,當然,還有其他一些狀態,比如阻塞,這是臨時狀態,這是具備運行資格,但是沒有執行權 ## 四.獲取線程對象和名稱 > 線程都是有名稱的,通過格式Thread-編號來區分,我們可以這樣來驗證 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); } } class MyThread extends Thread { @Override public void run() { System.out.println("線程名稱:"+this.getName()); } } ~~~ > 它輸出的結果就是 ![這里寫圖片描述](http://img.blog.csdn.net/20160603220039059) > 他是從0開始,當然,他既然有getrName,那肯定有setName方法,其實他初始化的時候就有方法,父類已經給我們提供好了 ~~~ package com.lgl.hellojava; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { MyThread thread = new MyThread("hello"); thread.start(); } } class MyThread extends Thread { public MyThread(String name) { super(name); } @Override public void run() { System.out.println("線程名稱:"+this.getName()); } } ~~~ > 那么我們輸出的結果 ![這里寫圖片描述](http://img.blog.csdn.net/20160603220303095) > 它還可以通過Thread.currentThread()來獲取對象名稱,它等同于this.getName(); ## 五.多線程實例演示 > 我們來一個簡單的實例來結束本篇blog,那就是賣票了,很多窗口都能賣票,這就是同時運行 ~~~ package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 需求:簡單的賣票程序,多個線程同時賣票 */ MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); MyThread my3 = new MyThread(); MyThread my4 = new MyThread(); my1.start(); my2.start(); my3.start(); my4.start(); } } /** * 賣票程序 * * @author LGL * */ class MyThread extends Thread { // 票數 private int tick = 100; @Override public void run() { while (true) { if (tick > 0) { System.out.println(currentThread().getName()+"賣票:" + tick--); } } } } ~~~ > 我們這樣就實現了票賣了,但是這里出了一個問題,四個線程,他一共賣了400張票,那可不行,火車就一百張票,這是不符合規則的,我們需要怎么改?讓四個對象共享一個票數,那我們就需要靜態了 ~~~ // 票數 private static int tick = 100; ~~~ > 但是我們一般不定義靜態,他的生命周期有點長,我們換一種角度考慮,其實這就關乎到創建方法了,我們在之前就講個,線程創建有兩種方法。 ## 六.Runnable接口 > 我們需要使用第二種方法,所以是這樣寫的,實現Runnable的接口 ~~~ package com.lgl.hellojava; import javax.security.auth.callback.TextInputCallback; //公共的 類 類名 public class HelloJJAVA { public static void main(String[] args) { /** * 需求:簡單的賣票程序,多個線程同時賣票 */ MyThread myThread = new MyThread(); Thread t1 = new Thread(myThread); Thread t2 = new Thread(myThread); Thread t3 = new Thread(myThread); Thread t4 = new Thread(myThread); t1.start(); t2.start(); t3.start(); t4.start(); } } /** * 賣票程序 * * @author LGL * */ class MyThread implements Runnable { // 票數 private int tick = 100; @Override public void run() { while (true) { if (tick > 0) { System.out.println("賣票:" + tick--); } } } } ~~~ > 我們得到的輸出結果就正確了 ![這里寫圖片描述](http://img.blog.csdn.net/20160603223324961) > 創建線程的第二種方式,實現Runnable接口 * 1.定義類實現Runnable接口 * 2.覆蓋Runnable接口的run方法? * 將線程要運行的代碼存放在該run方法中 * 3.通過Thread類建立線程對象 * 4.將Runnable接口的子類對象作為實際參數傳遞給Thread類的構造函數? * 為什么要將Runnable接口的子類對象傳遞給Thread的構造函數,因為,自定義的run方法所屬的對象是Runnable接口的子類對象,所以要讓線程去指定對象的run方法,就必須明確該run方法所屬的對象 * 5.調用Thread類的start方法開啟線程并調用Runnable接口的run方法 > 這兩種方式有什么區別呢? * 實現方式好處,避免了單繼承的局限性,在定義線程時,建議使用實現方式 * 線程代碼存放的位置不一樣 ### 小伙伴們有沒有對線程了解的更深刻一點呢?不明白沒關系,我們下篇還是接著講線程,如果有興趣可以加入群:555974449,歡迎一起交流 版權聲明:本文為博主原創文章,博客地址:http://blog.csdn.net/qq_26787115,未經博主允許不得轉載。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看