java高階9 執行緒

2021-08-15 19:25:33 字數 3279 閱讀 9951

執行緒:

乙個程序中可以只有乙個執行緒,也可以包含許多個執行緒

多執行緒:

就是乙個正在執行的程式中的多個執行緒同時在執行

以下四種皆可實現執行緒

thread();   // 建立乙個執行緒

thread(string name); // 建立乙個名字為name的執行緒

常用方法:

start();    // 使執行緒開始執行

run(); // 是執行緒執行操作

sleep(long millis); // 使執行緒休眠millis毫秒(暫停millis毫秒)

建立執行緒的步驟:

1.建立乙個類,使其繼承thread類

2.重寫父類中的run()方法,原因是因為父類中的run方法什麼也不執行,只返回乙個null,沒有用處,所以需要自己重寫之後實現需求

3.建立子類物件

4.通過子類物件呼叫start()方法開啟執行緒,當執行緒開啟時,就會通知jvm去呼叫run方法

子類的方法:

setname(string name); // 給建立的執行緒賦予名字

getname(); // 獲取當前執行緒的名字

thread(runnable run); // 將建立的實現類物件傳入構造方法中

thread(runnable run, string name); // 將建立的實現類物件傳入構造方法中,並給執行緒起名字

建立執行緒的步驟:

1.建立乙個類,使其實現runnable介面

2.重寫介面中的run()方法這裡需要注意,callable介面庫中的run方法是由返回值的,可通過get方法獲取到這個值,當然,get方法是阻塞的,即:執行緒無返回結果,get方法會一直等待。

3.建立子類物件

4.通過thread(runnable);方法,建立執行緒物件

5.通過執行緒物件呼叫start()方法開啟執行緒

建立執行緒的步驟:

1.建立乙個類,實現callable介面

2.重寫介面中的run()方法

3.建立實現類:

callable onecallable = new implementscallable();
4.建立futuretask類物件,將建立的onecallable物件傳入:

futuretask futuretask = new futuretask(implementscallable);
5.建立執行緒,將futuretask物件傳入

thread

thread

=new

thread(futuretask);

6.開啟執行緒

1.建立乙個類,實現callable介面

2.重寫介面中的run()方法

3.建立執行緒池

/*  corepoolsize:池中所儲存的執行緒數,包括空閒執行緒。

* maximumpoolsize:池中允許的最大執行緒數。

* keepalivetime:當執行緒數大於核心時,此為終止前多餘的空閒執行緒等待新任務的最長時間

* unit:引數的時間單位。

* workqueue:執行前用於保持任務的佇列。此佇列僅保持由 execute 方法提交的 runnable 任務。

* */

threadpoolexecutor threadpoolexecutor = new threadpoolexecutor(

corepoolsize, maximumpoolsize, keepalivetime, unit, workqueue);

4.建立實現類物件

實現類 物件名 =new 實現類(引數);
5.呼叫連線池中的submit(實現類物件):方法,將實現類物件傳入方法中

threadpoolexecutor.submit(實現類物件);
6完成

多執行緒安全問題

如果多個執行緒需要執行同乙個任務,那麼實現步驟如下

1.建立乙個類,使其實現runnable介面

2.重寫run方法

3.建立子類物件

4.建立執行緒,將子類物件傳入構造方法中這樣,如果建立多個執行緒時,傳入的引數都是同乙個子類物件,那麼就會執行同乙個任務

5.開啟執行緒

執行緒安全問題出現的原因

1.有多個執行緒

2.多個執行緒共享同乙個資料

3.多個執行緒併發(同時)的訪問同乙個資料

多執行緒安全問題解決

synchronized(鎖物件)
鎖物件要被所有執行緒共享

許可權修飾符 synchronized 返回值型別 方法名() 

執行緒的生命週期

通過executors的靜態方法來建立執行緒池(四種方法)。

newfixedthreadpool(int nthreads)

建立乙個固定長度的執行緒池,每當提交乙個任務就建立乙個執行緒,直到達到執行緒池的最大數量,這時執行緒規模將不再變化,當執行緒發生未預期的錯誤而結束時,執行緒池會補充乙個新的執行緒

newcachedthreadpool()

建立乙個可快取的執行緒池,如果執行緒池的規模超過了處理需求,將自動**空閒執行緒,而當需求增加時,則可以自動新增新執行緒,執行緒池的規模不存在任何限制

newsinglethreadexecutor()

這是乙個單執行緒的executor,它建立單個工作執行緒來執行任務,如果這個執行緒異常結束,會建立乙個新的來替代它;它的特點是能確保依照任務在佇列中的順序來序列執行

newscheduledthreadpool(int corepoolsize)

建立了乙個固定長度的執行緒池,而且以延遲或定時的方式來執行任務,類似於timer。

同步鎖synchronized

用於修飾方法或**塊,被修飾的**塊或方法如果被執行緒訪問則上鎖,直到進入當前方法或**塊的執行緒完成操作,後面的執行緒才能訪問

lock鎖

java併發 執行緒通訊 9

需要通訊的多種方式以及注意事項請移步 執行緒通訊方式 1 多個執行緒之間通過共享變數通訊。也就是a執行緒修改了變數x 11,b執行緒拿到x的值就是a修改之後的值11。這也是執行緒之間的間接通訊。2.通過方法wait,notiy,notifiall.wait a執行緒呼叫了該方法,那麼a執行緒將沉睡,...

java高階(二) 多執行緒

即 最大限度的利用cpu資源 當某一線程的處理不需要占用cpu而只和i o等資源打交道時,讓需要占用cpu資源的其他執行緒有機會獲得cpu資源。方法一 通過繼承thread類建立執行緒 class mythread extends thread public class threadtest 方法二...

併發程式設計 9 執行緒池 高階執行緒管理

所以從管理執行緒和任務的機制,兩個角度介紹執行緒池。一 簡單的執行緒池 定義 管理乙個任務佇列,乙個執行緒佇列,然後每次取乙個任務分配給乙個執行緒去做,迴圈往復。作為最簡單的執行緒池,其擁有固定數量的工作執行緒 通常工作執行緒數量std thread hardware concurrency 相同 ...