JAVA_SE基礎知識——多線程以及線程池的使用

1、進程與線程

進程第指在系統中正在運行的一個應用程序,線程是比進程更小的執行單位
一個進程可以產生多個線程,多線程機制使程序運行效率變得更高

多線程好處:解決了多部分代碼同時運行的問題
多線程弊端:線程太多,單個線程運行效率降低

2、多線程實現的方式:

a、繼承Thread類----本身是線程資源還是個線程
	1、子類重寫父類中的run方法,將線程運行的代碼存放在run中
	2、建立子類對象的同時線程也被創建
	3、通過調用start方法開啓線程
	  start方法調用線程,run執行線程代碼
	4、子類重寫Thread的run方法
	
	eg:ThreadDemo th=new ThreadDemo("nana");
	    th.start();

	一個線程類對象只能調用一次線程。

b、實現Runnable 接口----本身是線程資源不是線程
	1、子類覆蓋接口中的run方法
	2、通過Thread類創建線程,並將實現了Runnable接口的子類對象作爲參數
	   傳遞給Thread類的構造函數
	3、Thread類對象調用start方法開啓線程
	eg:ThreadDemo2 td = new ThreadDemo2();
	    new Thread(td).start();
	    new Thread(td).start();

    兩種方式的區別:繼承Thread類受單繼承影響,不適合多個線程共享資源
		實現Runnable接口方便資源共享

c、實現Callable接口通過FutureTask包裝器來創建Thread線程

d-線程池
    eg:ThreadDemo td=new ThreadDemo();
	ExecutorService es=Executors.newFixedThreadPool(3);//創建線程池,池裏有3個線程
	es.execute(td);//調用線程

3、線程的四種狀態

被創建(就緒)
運行
凍結
消亡

sleep方法需要指定睡眠時間,單位是毫秒
wait()方法需要被notify()方法喚醒

4、線程操作方法

public static Thread currentThread();//返回當前線程
public final String getName();//返回當前線程名稱
public final void setPriority(int priority);//設置線程優先級
	提高線程搶佔CPU資源的可能性(1,5,10),但是並不代表一定可以搶到
public void start();//開始執行線程
public static void sleep(long m);//使用目前的線程休眠 
public final void yield();//線程的禮讓,暫定當前線程,讓其他線程先運行
public void run();//執行線程

5、Object是所有類的祖先,包含以下對線程操作相關的方法

public final void wait();//線程等待
public final void wait(long timeout);//線程等待,並指定等待時間
public void notify();//喚醒第一個等待的線程
public void notifyAll();//喚醒全部等待的線程

6、線程同步

同步:在同一時間段內只能運行一個線程。可以解決線程中的安全問題
前提:同步需要兩個或者兩個以上的線程
      多個線程使用的是同一個資源
未滿足上述兩個條件不能成爲同步

同步的弊端:當線程相當多時,因爲每個線程都會去判斷同步上的鎖,這
	是很耗費資源的,無形中會降低程序運行的效率

線程同步:同步代碼塊、同步方法
	同步代碼塊:synchronized(同步對象 類名.class){ 需要同步的代碼 }
		synchronized鎖住的是括號裏的對象,而不是代碼。
		eg:synchronized (TickedSell2.class) {
			if (t>0) {
				System.out.println("票號"+t--);
			}	
		     }

同步方法:把代碼塊做成方法,然後再調用

7、線程死鎖:

彼此佔用對方所需要的資源,雙方進行不下去

8、常用的線程池使用方法

public static ExecutorService newFixedThreadPool(int nThreads) 
創建固定數目線程的線程池。

public static ExecutorService newCachedThreadPool() 
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。


public static ExecutorService newSingleThreadExecutor() 
創建一個單線程化的Executor。
public static 

ScheduledExecutorService newScheduledThreadPool(int 
corePoolSize) 
創建一個支持定時及週期性的任務執行的線程池,多數情況下可用來替代Timer類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章