執行緒:
乙個程序中可以只有乙個執行緒,也可以包含許多個執行緒
多執行緒:
就是乙個正在執行的程式中的多個執行緒同時在執行
以下四種皆可實現執行緒
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 相同 ...