一.基礎知識
1.線程與進程
進程:進程是程序關於某項操作的一次運行活動,是操作系統進行資源調度和分配的單位。進程是線程的集合。
線程:線程是進程的一條執行路徑,是cpu進行調度和分配的單位。
舉例:進程就像是一個工廠,完成着cpu分配的任務,同一時刻只能有一條線程在執行,線程就好比是工廠的工人,許多工人同時完成任務。
2.什麼是多線程
在同一時刻,有多條執行路徑,多線程的目的是提高程序的運行效率。
3.多線程使用場景
迅雷下載、數據庫連接池、分批發送短信。
4.多線程的創建方式
(1)繼承Thread,重寫run方法。
package com.zhu.mayi.thread_demo;
/**
* Hello world!
*
*/
//1.什麼是線程?線程是進程的一條執行路徑
//2.什麼是多線程?多線程是在一個進程中,多條線程併發執行
//3.在一個進程中,一定會有主線程
//4.線程分爲:主線程、子線程、GC線程、用戶線程、守護線程
//多線程的實現方式? 1.繼承thread類重寫run方法 2.實現runnable接口 3.利用匿名內部類方式 4.使用線程池
//1.繼承thread類重寫run方法
class test extends Thread{
@Override
public void run() {
for(int i = 0;i<10;i++){
System.out.println("chird:i="+i);
}
}
}
public class threagTest1
{
public static void main( String[] args )
{
System.out.println("主線程開始");
test test1 = new test();
test1.start();
for(int i = 0;i<10;i++){
System.out.println("main:i="+i);
}
System.out.println("主線程結束");
}
}
(2)實現runnable接口。
package com.zhu.mayi.thread_demo;
class test2 implements Runnable{
public void run() {
for(int i = 0;i < 10;i++){
System.out.println("i="+i);
}
}
}
//實現Runnable接口,重寫run方法
/**
* @author johson
*
*/
public class threadTest2 {
public static void main(String[] args){
System.out.println("主線程開始");
test2 test = new test2();
Thread thread = new Thread(test);
thread.start();
for(int j = 0;j < 10;j++){
System.out.println("j="+j);
}
System.out.println("主線程結束");
}
}
(3)使用匿名內部類。
package com.zhu.mayi.thread_demo;
public class threadTest3 {
//使用內部類方式
public static void main(String[] args){
System.out.println("主線程開始");
Thread thread = new Thread(new Runnable() {
public void run() {
for(int i = 0;i < 10;i++){
System.out.println("i=" + i);
}
}
});
thread.start();
for(int j = 0;j < 10;j++){
System.out.println("j=" + j);
}
System.out.println("主線程結束");
}
}
(4)實現Callable接口。
未作實現
5.多線程的五種狀態
(1)新建狀態:線程剛被創建的時候,使用new關鍵字創建線程——new Thread(t),此時線程的代碼還未執行。
(2)就緒狀態:線程新建後,需要通過start()方法去執行。start()方法創建線程運行的系統資源,線程就進入了就緒狀態。也就是說,就緒狀態就是在線程創建後,獲得cpu時間執行run()方法之前。
(3)運行狀態:獲得CPU時間後,它才進入運行狀態,開始執行run()方法。
(4)阻塞狀態:阻塞狀態有以下幾種情況:
a.線程調用了sleep()方法進入睡眠狀態。
b.線程試圖獲取一個鎖,但是這個鎖正被其他線程佔用,還未釋放。
c.線程正在等待某個觸發條件。
(5)死亡狀態:死亡狀態可能有以下原因造成:
a.run()方法正常執行完畢
b.程序發生異常,造成run()方法結束
爲了確定線程在當前是否存活着(就是要麼是可運行的,要麼是被阻塞了),需要使用isAlive方法。如果是可運行或被阻塞,這個方法返回true; 如果線程仍舊是new狀態且不是可運行的, 或者線程死亡了,則返回false。
6.多線程的幾種方法
a.join()方法
將執行權交給另一個線程。例如當在主線程當中執行到t1.join()方法時,就認爲主線程應該把執行權讓給t1。
b.Yield方法
Thread.yield()方法的作用:暫停當前正在執行的線程,並執行其他線程。(可能沒有效果)
c.wait、notify方法
wait()暫定當前正在執行的線程,並釋放資源鎖,讓其他線程可以有機會運行notify/notifyall: 喚醒因鎖池中的線程,使之運行
d.sleep方法
sleep()方法導致了程序暫停執行指定的時間,讓出cpu給其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
————————————————————————————————————————未完待續,歡迎各位大佬指出問題。