JAVA之線程學習

進程:一個應用程序在處理機上的一次執行過程,它是一個動態的概念,包含一個或多個線程。html

線程:是進程的一個實體,是CPU調度和分派的基本單位。java

一個線程的生命週期:多線程

  新建狀態(start())ide

  就緒狀態(start())spa

       運行狀態(run())線程

       阻塞狀態()代理

       死亡狀態(stop()或destory())code

若是一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所佔用資源以後,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或得到設備資源後能夠從新進入就緒狀態。能夠分爲三種:htm

  • 等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。對象

  • 同步阻塞:線程在獲取 synchronized 同步鎖失敗(由於同步鎖被其餘線程佔用)。

  • 其餘阻塞:經過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程從新轉入就緒狀態。

線程優先級:Java 線程的優先級是一個整數,其取值範圍是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。

默認狀況下,每個線程都會分配一個優先級 NORM_PRIORITY(5)。

 

Java線程的幾個重要方法

1.start()與run():實現線程類時不管是繼承Thread類仍是實現Runnable接口,都要實現run()方法          實現具體的線程業務邏輯,可是真正啓動線程類時要注意使用start()方法,調用         run()方法並不會啓動一個線程去執行,只會當成普通的類方法來執行。
         因此start()方法會啓動2個線程運行,而run()方法只會啓動一個線程。

2.yield():暫停當前正在執行的線程對象,並執行其餘線程。

      調用方法以後線程會當即釋放佔用的資源,CPU能夠轉向執行其它的線程。可是具體執      行哪一個線程並不肯定,因此也有可能下次仍是執行當前線程。

3.join():暫停當前正在執行的線程對象,並執行其餘線程。

4.sleep():在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行)

建立線程的方法

1.經過繼承Thread類

package com.demo.thread;

/*1.建立多線程:  繼承Thread方法     重寫run():查看Thread源碼有個run方法
 *2.使用線程:建立子類對象,對象.start()啓動
 *繼承Thread類方式的缺點:若是一個類已經從一個類繼承,則再沒法繼承Thread類
 * */
class Thread1 extends Thread{
    @Override
    public void run() {
        //線程體,運行一切從run開始
        for(int i=0;i<5;i++){
            System.out.println("兔子跑了"+i+"");
        }
    }
}
class Thread2 extends Thread{
    @Override
    public void run() {
        //線程體,運行一切從run開始
        for(int i=0;i<5;i++){
            System.out.println("烏龜跑了"+i+"");
        }
    }
}
public class ThreadTest{
    public static void main(String[] args) {
        //建立子類對象
        Thread1 thread1= new Thread1();
        Thread2 thread2= new Thread2();
        //調用start方法,啓動線程
        thread1.start();
        thread2.start();
    }
}

2.實現Runnable接口

package com.demo.thread;
/*使用Runnable建立線程:避免單繼承的侷限性,便於共享資源
 * 1.類實現Runnable接口+重寫run()----->真實角色類
 * 2.啓動多線程,使用靜態代理
 *     1)建立真實角色
 *  2)建立代理角色+真實角色引用
 *  3)調用.start()啓動線程
 * 
 * 
 * */
class Runna implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println("一邊吃飯");
        }
        
    }
    
}
public class RunnableTest {
        public static void main(String[] args) {
//             1)建立真實角色
            Runna runna = new Runna();
//             2)建立代理角色+真實角色引用
            Thread proxy = new Thread(runna);
//             3)調用.start()啓動線程
            proxy.start();
            
            for(int i=0;i<1000;i++){
                System.out.println("一邊玩手機");
            }
        }
}

 

 

                            參考:菜鳥教程

                                                詳細線程介紹

相關文章
相關標籤/搜索