進程:一個應用程序在處理機上的一次執行過程,它是一個動態的概念,包含一個或多個線程。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("一邊玩手機"); } } }
參考:菜鳥教程