成都創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)、手機(jī)APP定制開發(fā)、微信小程序、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
介紹多線程之前要介紹線程,介紹線程則離不開進(jìn)程。
首先進(jìn)程:是一個正在執(zhí)行中的程序,每一個進(jìn)程執(zhí)行都有一個執(zhí)行順序,該順序是一個執(zhí)行路徑,或者叫一個控制單元;
線程:就是進(jìn)程中的一個獨立控制單元,線程在控制著進(jìn)程的執(zhí)行。一個進(jìn)程中至少有一個進(jìn)程。
多線程:一個進(jìn)程中不只有一個線程。
為什么要用多線程:
新建:從新建一個線程對象到程序start() 這個線程之間的狀態(tài),都是新建狀態(tài);
就緒:線程對象調(diào)用start()方法后,就處于就緒狀態(tài),等到JVM里的線程調(diào)度器的調(diào)度;
運行:就緒狀態(tài)下的線程在獲取CPU資源后就可以執(zhí)行run(),此時的線程便處于運行狀態(tài),運行狀態(tài)的線程可變?yōu)榫途w、阻塞及死亡三種狀態(tài)。
等待/阻塞/睡眠:在一個線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法后會失去所占有的資源,從而進(jìn)入阻塞狀態(tài),在睡眠結(jié)束后可重新進(jìn)入就緒狀態(tài)。
終止:run()方法完成后或發(fā)生其他終止條件時就會切換到終止?fàn)顟B(tài)。
步驟: 、定義類繼承Thread;
目的:將自定義代碼存儲在run方法,讓線程運行
該方法有兩步:啟動線程,調(diào)用run方法。
實現(xiàn)步驟: 、定義類實現(xiàn)Runnable接口
實現(xiàn)步驟:
繼承Thread:線程代碼存放在Thread子類run方法中。
實現(xiàn)Runnable:線程代碼存放在接口的子類的run方法中。
實現(xiàn)Callable:
線程睡眠的原因:線程執(zhí)行的太快,或需要強制執(zhí)行到下一個線程。
線程睡眠的方法(兩個):sleep(long millis)在指定的毫秒數(shù)內(nèi)讓正在執(zhí)行的線程休眠。
sleep(long millis,int nanos)在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)讓正在執(zhí)行的線程休眠。
線程睡眠的代碼演示:
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();
}
}
}
}
}
每隔一秒則會打印一次,打印結(jié)果為:
倒計時:10
倒計時:9
倒計時:8
倒計時:7
倒計時:6
倒計時:5
倒計時:4
倒計時:3
倒計時:2
倒計時:1
倒計時:0
擴(kuò)展:
Java線程調(diào)度是Java多線程的核心,只有良好的調(diào)度,才能充分發(fā)揮系統(tǒng)的性能,提高程序的執(zhí)行效率。但是不管程序員怎么編寫調(diào)度,只能最大限度的影響線程執(zhí)行的次序,而不能做到精準(zhǔn)控制。因為使用sleep方法之后,線程是進(jìn)入阻塞狀態(tài)的,只有當(dāng)睡眠的時間結(jié)束,才會重新進(jìn)入到就緒狀態(tài),而就緒狀態(tài)進(jìn)入到運行狀態(tài),是由系統(tǒng)控制的,我們不可能精準(zhǔn)的去干涉它,所以如果調(diào)用Thread.sleep(1000)使得線程睡眠1秒,可能結(jié)果會大于1秒。
同步的前提:
如何找問題?