1. 程式人生 > 其它 >多執行緒相關知識

多執行緒相關知識

一,程序和執行緒

程序和執行緒的概念

並行和併發的概念

執行緒基本應用

程序:當一個程式被執行,就相當於開啟了一個程序。

執行緒:一個程序內可以分到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就緒狀態,然後執行其他執行緒