標籤:調用 span java 線程 gpo 多個 -- 缺點 靜態 multi
進程:一個應用程式在處理機上的一次執行過程,它是一個動態概念,包含一個或多個線程。
線程:是進程的一個實體,是CPU調度和指派的基本單位。
一個線程的生命週期:
建立狀態(start())
就緒狀態(start())
運行狀態(run())
阻塞狀態()
死亡狀態(stop()或destory())
如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所佔用資源之後,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得裝置資源後可以重新進入就緒狀態。可以分為三種:
等待阻塞:運行狀態中的線程執行 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("一邊玩手機"); } }}
參考:菜鳥教程
詳細線程介紹
JAVA之線程學習