線程、程式、程序基本概念
線程與程序相似,但線程是CUP排程和分派的基本機關,它是比程序更小的能獨立運作的基本機關。一個程序在執行的過程中可以産生多個線程。與程序不同的是同類的多個線程共享同一塊記憶體空間和一組系統資源,是以系統在産生一個線程或是各個線程之間切換工作時,負擔要比程序小得多,也正因為如此,線程也被稱為輕量級程序。
程式是含又指令和資料的檔案,被存儲在磁盤或其他的資料儲存設備中,也就是說程式是靜态的代碼。
程序是程式的⼀次執⾏過程,是系統運⾏資源配置設定和排程的基本機關,是以程序是動态的。系統運⾏⼀個程式即是⼀個程序從建立,運⾏到消亡的過程。簡單來說,⼀個程序就是⼀個執⾏中的程式,它在計算機中⼀個指令接着⼀個指令地執⾏着,同時,每個程序還占有某些系統資源如 CPU 時間,記憶體空間,⽂件,輸⼊輸出裝置的使⽤權等等。換句話說,當程式在執⾏時,将會被作業系統載⼊記憶體中。 線程是程序劃分成的更⼩的運⾏機關。線程和程序最⼤的不同在于基本上各程序是獨⽴的,⽽各線程則不⼀定,因為同⼀程序中的線程極有可能會互相影響。從另⼀⻆度來說,程序屬于作業系統的範疇,主要是同⼀段時間内,可以同時執⾏⼀個以上的程式,⽽線程則是在同⼀程式内⼏乎同時執⾏⼀個以上的程式段。
線程有哪些基本狀态
線程是一個動态執行的過程,它有一個從産生到死亡的過程,共五種狀态
-
建立(new Thread)
當建立 Thread 類的一個執行個體(對象)時,此線程進入建立狀态(未被啟動)
例如:Thread t1=new Thread();
-
就緒(runnable)
線程已經被啟動,正在等待被配置設定給 CPU 時間片,也就是說此時線程正在就緒隊列中排隊等候得到 CPU 資源。例如:t1.start();
-
運作(running)
線程獲得 CPU 資源正在執行任務(run()方法),此時除非此線程自動放棄CPU 資源或者有優先級更高的線程進入,線程将一直運作到結束。
-
死亡(dead)
當線程執行完畢或被其它線程殺死,線程就進入死亡狀态,這時線程不可能再進入就緒狀态等待執行。
自然終止:正常運作 run()方法後終止
異常終止:調用 stop()方法讓一個線程終止運作
-
堵塞(blocked)
由于某種原因導緻正在運作的線程讓出 CPU 并暫停自己的執行,即進入堵
塞狀态。
正在睡眠:用 sleep(long t) 方法可使線程進入睡眠方式。一個睡眠着的線程在指定的時間過去可進入就緒狀态。
正在等待:調用 wait()方法。(調用 motify()方法回到就緒狀态)
被另一個線程所阻塞:調用 suspend()方法。(調用 resume()方法恢複)
線程建立之後它将處于 NEW(建立) 狀态,調⽤ start() ⽅法後開始運⾏,線程這時候處于READY(可運⾏) 狀态。可運⾏狀态的線程獲得了 cpu 時間⽚(timeslice)後就處于 RUNNING(運⾏) 狀态。當線程執⾏ wait() ⽅法之後,線程進⼊ WAITING(等待)狀态。進⼊等待狀态的線程需要依靠其他線程的通知才能夠傳回到運⾏狀态,⽽ TIME_WAITING(逾時等待) 狀态相當于在等待狀态的基礎上增加了逾時限制,⽐如通過 sleep(long millis) ⽅法或 wait(long millis) ⽅法可以将 Java線程置于 TIMED WAITING 狀态。當逾時時間到達後 Java 線程将會傳回到 RUNNABLE 狀态。當線程調⽤同步⽅法時,在沒有擷取到鎖的情況下,線程将會進⼊到 BLOCKED(阻塞) 狀态。線程在執⾏Runnable 的 run() ⽅法之後将會進⼊到 TERMINATED(終⽌) 狀态。