天天看點

聊聊java中的線程

聊聊java中的線程

堅持原創,寫好每一篇文章

随着使用者量的逐漸增多,請求越來越多,并發問題随之而來,線程的學習自然也成了重點内容,也是出去找工作不得不進行準備的知識點。

線程的實作方式

對于線程的實作方式是一個老生常談的問題了,可以通過實作Runnable接口重寫run()方法實作,可以實作Callable接口,也可以繼承Thread類來實作。Runnable和Callable的差別在于前者執行任務後不傳回資料,而實作Callable接口的線程執行任務後可以傳回結果資料。

具體而言,定義XppCallable類,實作Callable接口,需要重寫的是call()方法,這個方法就是定義傳回的資料值。

ExecutorService exec = Executors.newCachedThreadPool();
    ArrayList<Future<String>> results =
      new ArrayList<Future<String>>();
    for(int i = 0; i < 10; i++)
      results.add(exec.submit(new XppCallable(i)));
           

通過定義線程池執行線程後,XppCallable線程的所有結果集都會儲存到了這個results結果集合中。由于這個結果集是個所有線程的結果集的累加,是以我們在進行周遊這個集合的時候有可能被阻塞,因為有可能線程還沒有傳回結果,它就一直在那裡等着。

for(Future<String> fs : results){
    System.out.println(fs.get());
}
           

這裡是調用Future接口中的get()方法來擷取值,除此以外,Future接口還提供了包含逾時時間的get()方法和檢測線程是否完成任務的方法isDone()方法。

啟動線程

對于線程的啟動直接new Thread()建立線程然後調用start()方法啟動就可以了。我們還可以使用線程池建立Executor執行器來還線上程,具體是調用ExecutorService執行個體的execute()方法

代碼如下所示:

public static void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool();
    for(int i = 0; i < 6; i++)
      exec.execute(new XppThread());
    exec.shutdown();
  }
           

對于線程池的分類也是老生常談的東西,這裡用到的是可緩存的線程池,超過一定長度會回收空閑的線程池,除此以外,還有固定線程數量的線程池,隻有一個線程的線程池。

join()方法

總結

❤️ 感謝大家

  1. 歡迎關注我❤️,點贊👍🏻,評論🤤,轉發🙏
  2. 關注

    盼盼小課堂

    ,定期為你推送好文,還有群聊不定期抽獎活動,可以暢所欲言,與大神們一起交流,一起學習。
  3. 有不當之處歡迎批評指正。