您好,登錄后才能下訂單哦!
介紹多線程之前要介紹線程,介紹線程則離不開進程。
首先進程 :是一個正在執行中的程序,每一個進程執行都有一個執行順序,該順序是一個執行路徑,或者叫一個控制單元;
線程:就是進程中的一個獨立控制單元,線程在控制著進程的執行。一個進程中至少有一個進程。
多線程:一個進程中不只有一個線程。
為什么要用多線程:
新建 :從新建一個線程對象到程序start() 這個線程之間的狀態,都是新建狀態;
就緒 :線程對象調用start()方法后,就處于就緒狀態,等到JVM里的線程調度器的調度;
運行 :就緒狀態下的線程在獲取CPU資源后就可以執行run(),此時的線程便處于運行狀態,運行狀態的線程可變為就緒、阻塞及死亡三種狀態。
等待/阻塞/睡眠 :在一個線程執行了sleep(睡眠)、suspend(掛起)等方法后會失去所占有的資源,從而進入阻塞狀態,在睡眠結束后可重新進入就緒狀態。
終止 :run()方法完成后或發生其他終止條件時就會切換到終止狀態。
步驟: 、定義類繼承Thread;
目的:將自定義代碼存儲在run方法,讓線程運行
該方法有兩步:啟動線程,調用run方法。
實現步驟: 、定義類實現Runnable接口
實現步驟:
繼承Thread:線程代碼存放在Thread子類run方法中。
實現Runnable:線程代碼存放在接口的子類的run方法中。
實現Callable:
線程睡眠的原因:線程執行的太快,或需要強制執行到下一個線程。
線程睡眠的方法(兩個):sleep(long millis)在指定的毫秒數內讓正在執行的線程休眠。
sleep(long millis,int nanos)在指定的毫秒數加指定的納秒數內讓正在執行的線程休眠。
線程睡眠的代碼演示:
public class SynTest {
public static void main(String[] args) {
new Thread(new CountDown(),"倒計時").start();
}
}
class CountDown implements Runnable{
int time = 10;
public void run() {
while (true) {
if(time>=0){
System.out.println(Thread.currentThread().getName() + ":" + time--);
try {
Thread.sleep(1000);
//睡眠時間為1秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
每隔一秒則會打印一次,打印結果為:
倒計時:10
倒計時:9
倒計時:8
倒計時:7
倒計時:6
倒計時:5
倒計時:4
倒計時:3
倒計時:2
倒計時:1
倒計時:0
擴展:
Java線程調度是Java多線程的核心,只有良好的調度,才能充分發揮系統的性能,提高程序的執行效率。但是不管程序員怎么編寫調度,只能最大限度的影響線程執行的次序,而不能做到精準控制。因為使用sleep方法之后,線程是進入阻塞狀態的,只有當睡眠的時間結束,才會重新進入到就緒狀態,而就緒狀態進入到運行狀態,是由系統控制的,我們不可能精準的去干涉它,所以如果調用Thread.sleep(1000)使得線程睡眠1秒,可能結果會大于1秒。
同步的前提:
如何找問題?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。