多線程基礎(chǔ)篇--線程狀態(tài)

1.多線程之線程狀態(tài)

先看一下我網(wǎng)上找到的圖:


Paste_Image.png
  • new
    線程被創(chuàng)建出來,通過new Thread();就是創(chuàng)建了一個(gè)線程,這個(gè)時(shí)候創(chuàng)建的線程并沒有執(zhí)行。
  • runnable
    表示可以執(zhí)行的,也就是調(diào)用了start()方法,調(diào)用了start()并不是說線程就運(yùn)行了,而是需要等操作系統(tǒng)的調(diào)度,也就是時(shí)間片的輪轉(zhuǎn)。
  • running
    這個(gè)時(shí)候表示線程已經(jīng)在執(zhí)行了,也就是獲得了時(shí)間片,在運(yùn)行的過程中可能有一些情況會(huì)讓出CPU,線程會(huì)進(jìn)入另外一種狀態(tài)。
  1. 當(dāng)前線程高風(fēng)亮節(jié)讓出CPU,也就是調(diào)用yeild()方法,是當(dāng)前線程回到runnable狀態(tài)。
    2)當(dāng)前線程調(diào)用了sleep(),線程進(jìn)入了wait狀態(tài),也就是圖上所說的blocked();如果線程調(diào)用join()也是類似情況
    3)當(dāng)前線程遇到同步代碼塊,或者同步方法(synchronized)線程會(huì)進(jìn)入blocked狀態(tài);如果線程被wait()也也進(jìn)入blocked狀態(tài)。
  • blocked
    這個(gè)時(shí)候表示線程被阻塞了,阻塞的情況有很多,可能sleep(),wait(),synchronized等等。
  • dead
    當(dāng)前線程執(zhí)行完了,或者異常退出了。

2.多線程之創(chuàng)建線程

多線程有兩種創(chuàng)建方式:

  • implement runnable
//通過實(shí)現(xiàn)的方式
    static class MyThread1 implements Runnable {
        public void run() {
            System.out.println("this is implements two method....");
        }
    }
  • extends Thread
  //通過繼承的方式
    static class MyThread extends Thread {
        public void run() {
            System.out.println("this is extends thread one method.....");
        }
    }

Thread 和Runnable區(qū)別:

  • runnable 比thread靈活,因?yàn)镴ava是單繼承的,但是Java可以實(shí)現(xiàn)多個(gè)接口。
  • runnable可以實(shí)現(xiàn)資源共享
    例如:
package com.yuxi;

/**
 * Created by yuxi on 17/1/26.
 */
public class MyThread {
    public static void main(String[] args) {
        MyThreadOne myThreadOne1 = new MyThreadOne();
        myThreadOne1.start();

        MyThreadOne myThreadOne2 = new MyThreadOne();
        myThreadOne2.start();

        MyThreadOne myThreadOne3 = new MyThreadOne();
        myThreadOne3.start();
        MyThreadTwo myThreadTwo = new MyThreadTwo();
        Thread thread1 = new Thread(myThreadTwo);
        Thread thread2 = new Thread(myThreadTwo);
        Thread thread3 = new Thread(myThreadTwo);
        thread2.start();
        thread1.start();
        thread3.start();
    }

    static class MyThreadOne extends Thread {
        private int ticket=10;
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (ticket>0) {
                    System.out.println("當(dāng)前" + Thread.currentThread().getName() + "買了" + (ticket--) + "票");
                }
            }
        }
    }


    static class MyThreadTwo implements Runnable {
        private int ticket=10;
        public void run() {
            for (int i = 0; i < 20; i++) {
                if (ticket>0) {
                    System.out.println("當(dāng)前" + Thread.currentThread().getName() + "買了" + (ticket--) + "票");
                }
            }
        }
    }


}

如果是extends結(jié)果是:

當(dāng)前Thread-0買了10票
當(dāng)前Thread-0買了9票
當(dāng)前Thread-0買了8票
當(dāng)前Thread-0買了7票
當(dāng)前Thread-0買了6票
當(dāng)前Thread-0買了5票
當(dāng)前Thread-0買了4票
當(dāng)前Thread-0買了3票
當(dāng)前Thread-0買了2票
當(dāng)前Thread-0買了1票
當(dāng)前Thread-1買了10票
當(dāng)前Thread-1買了9票
當(dāng)前Thread-1買了8票
當(dāng)前Thread-1買了7票
當(dāng)前Thread-1買了6票
當(dāng)前Thread-1買了5票
當(dāng)前Thread-1買了4票
當(dāng)前Thread-1買了3票
當(dāng)前Thread-1買了2票
當(dāng)前Thread-1買了1票
當(dāng)前Thread-2買了10票
當(dāng)前Thread-2買了9票
當(dāng)前Thread-2買了8票
當(dāng)前Thread-2買了7票
當(dāng)前Thread-2買了6票
當(dāng)前Thread-2買了5票
當(dāng)前Thread-2買了4票
當(dāng)前Thread-2買了3票
當(dāng)前Thread-2買了2票
當(dāng)前Thread-2買了1票

如果是implement結(jié)果是:

當(dāng)前Thread-1買了10票
當(dāng)前Thread-0買了9票
當(dāng)前Thread-1買了8票
當(dāng)前Thread-0買了7票
當(dāng)前Thread-0買了5票
當(dāng)前Thread-1買了6票
當(dāng)前Thread-1買了3票
當(dāng)前Thread-1買了2票
當(dāng)前Thread-0買了4票
當(dāng)前Thread-2買了1票

原因是因?yàn)椋?br> MyThreadTwo myThreadTwo = new MyThreadTwo();
這個(gè)對(duì)于啟動(dòng)的三個(gè)線程是共享的,他的成員變量 private int ticket=10;是公共資源存在競(jìng)爭(zhēng)。
MyThreadOne myThreadOne1 = new MyThreadOne();
MyThreadOne myThreadOne2 = new MyThreadOne();
MyThreadOne myThreadOne3 = new MyThreadOne();
分別啟動(dòng)了三個(gè),這三個(gè)之間是不存在競(jìng)爭(zhēng)的。

參考文章:
http://www.cnblogs.com/skywang12345/p/3479063.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,594評(píng)論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,107評(píng)論 1 18
  • 寫在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的,為什么轉(zhuǎn)載兩個(gè)字加“”呢?因?yàn)檫@絕不是簡(jiǎn)單的復(fù)制粘貼,我花了五六個(gè)小...
    SmartSean閱讀 4,936評(píng)論 12 45
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍(lán)閱讀 7,466評(píng)論 3 87
  • 從去年開始就一直就休閑在家。時(shí)間過得飛快,轉(zhuǎn)眼一年多過去了,從最初的郁郁寡歡,煩悶,到如今習(xí)慣并接受而滿心歡喜。 ...
    閃亮的寫作者閱讀 650評(píng)論 0 0

友情鏈接更多精彩內(nèi)容