多執行緒相關知識
一,程序和執行緒
程序和執行緒的概念
並行和併發的概念
執行緒基本應用
程序:當一個程式被執行,就相當於開啟了一個程序。
執行緒:一個程序內可以分到1到多個執行緒。Java中執行緒是最小的排程單位。
併發:同一時間應對多件事情的能力
並行:同一時間動手做多件事情的能力
Java執行緒
建立和執行執行緒
檢視執行緒
執行緒API
執行緒狀態
方法1,直接使用thread
Thread t1 = new Thread(){ @Override public void run() { log.info("doing..."); } }; t1.start();
方法2,使用Runnable配合thread
thread代表執行緒
Runnable代表可執行的任務
Runnable running = new Runnable() { @Override public void run() { log.info("running"); } }; Thread t2 = new Thread(running); t2.start();
java8後可用lamda表示式
new Thread(
()->{log.info("running");
}).start();
方法3,FutureTask配合Thread
FutureTask<Integer> futureTask = new FutureTask<Integer>(() -> {
log.info("running...");
return 10;
});
new Thread(futureTask, "t1").start();
int result = futureTask.get();
log.info("the result is {}", result);
執行緒上下文切換
因為以下一些原因導致cpu不再執行當前的執行緒,轉而執行另一個執行緒的程式碼
執行緒的CPU時間片用完
垃圾回收
有更高優先順序的執行緒要執行
執行緒自己呼叫了sleep,yield,wait,join,park,synchronized,lock等方法。
執行緒常見方法
start(),啟動一個執行緒
run(),執行緒啟動後呼叫該方法
join(), 等待某個執行緒結束
getId(),獲取編號
getName(),獲取執行緒名
setName(),設定執行緒名
getState(),獲取執行緒狀態
isIntersrupted(),判斷是否被打斷
isAlive(),執行緒是否存活
interrupt(),打斷執行緒
currentThread(),獲取當前執行的執行緒
sleep(long n),讓當前執行的執行緒休眠n毫秒
yield(),提示執行緒排程器讓出當前執行緒對CPU的使用
詳細介紹:
start(), 啟動一個執行緒需要呼叫start()方法,呼叫run方法只是在主執行緒啟動run方法中的程式碼;
sleep(),呼叫該方法,會讓執行緒從running進入time waiting狀態,其他執行緒可以使用interrupt方法打斷正在睡眠的執行緒,這時sleep方法會丟擲InterruptedException異常。
睡眠後的執行緒未必會立即執行
yield(),呼叫該方法會讓當前執行緒從running進入runnable就緒狀態,然後執行其他執行緒