java學習——併發編程之多線程基礎

一.基礎知識

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給其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。

————————————————————————————————————————未完待續,歡迎各位大佬指出問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章