首頁 > 軟體

java 執行緒池存在的意義

2022-06-15 10:00:20

前言

再次之前我已經花費大量篇幅介紹了Java原聲鎖和Lock鎖。在文章中提到偏向送、輕量級鎖、重量級鎖、公平鎖、非公平鎖、自旋鎖、自適應自旋鎖、分散式鎖、分段鎖等等鎖。所有的鎖都是為了解決一個問題應運而生的那就是並行。而產生並行的原因是CPU的發展導致我們程式多執行緒執行。在程式碼中我們也經常通過多執行緒來提高產品的吞吐量。

在鎖章節中我們也是通過多執行緒案例模擬鎖的產生的。那麼Java領域中有哪幾種方式生成執行緒呢?容我慢慢道來

建立執行緒

繼承Thread

建立執行緒的方式Java為我們提供了四種方式,首先是繼承Thread 。複寫run方法就可以了。

 public class ExtendThread extends Thread{
     private Integer index;
 ​
     public ExtendThread(Integer index) {
         this.index = index;
     }
     @Override
     public void run() {
         System.out.println("當前索引值:"+index);
     }
 ​
     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             new ExtendThread(i).start();
         }
     }
 }

實現Runnable介面

第二種方式就是實現Runnable介面。我們點進Thread原始碼也能看到,thread的構造需要一個Runnable介面。

 public class TestRunnable implements Runnable{
     private String userName;
 ​
     public TestRunnable(String userName) {
         this.userName = userName;
     }
     @SneakyThrows
     @Override
     public void run() {
         TimeUnit.SECONDS.sleep(1);
         System.out.println("當前名稱:"+userName);
     }
 ​
     public static void main(String[] args) {
         for (int i = 0; i < 100; i++) {
             new Thread(new TestRunnable(String.format("我是%s", i))).start();
         }
     }
 }

實現Callable介面

除了上面兩種還有一個介面實現。還有一個Callable他和Runnable的區別在於有返回值

 public class TestCallable implements Callable {
     private int i;
 ​
     public TestCallable(int i) {
         this.i = i;
     }
     @Override
     public Object call() throws Exception {
         System.out.println(Thread.currentThread()+"我是"+i);
         return i;
     }
     public static void main(String[] args) throws ExecutionException, InterruptedException {
         final FutureTask futureTask = new FutureTask(new TestCallable(1));
         for (int i = 0; i < 100; i++) {
             new Thread(new FutureTask(new TestCallable(i))).start();
         }
         System.out.println(futureTask.get());
     }
 }

執行緒池

上面三種應該算是執行緒建立的基本方式。為了提高效能減少執行緒的開闢與銷燬,JDK提出了執行緒池的概念。執行緒池主要是線上程閒置後進行回收防止被JVM銷燬。這樣下次在來任務的時候就可以直接將閒置的執行緒提供給任務使用就可以了。執行緒池的建立預設有三種方式。這裡我們使用其中一種,至於執行緒池我們後面會著重介紹。

 public class TPools {
     public static void main(String[] args) {
         final ExecutorService executorService = Executors.newCachedThreadPool();
         for (int i = 0; i < 100; i++) {
 ​
             int finalI = i;
             executorService.execute(new Runnable() {
                 @Override
                 public void run() {
                     System.out.println("@@@@@"+ finalI);
                 }
             });
         }
     }
 }

小結

本章節我們簡單介紹了四種方式建立執行緒。使用上沒有區別。需要注意Callable介面是具有返回值的。這種方式其實我們可以用來確認執行緒是否執行了。然後就是執行緒池方式建立。從執行緒的角度四種方式建立出來的執行緒具有同等性質。不同的是執行緒池會對執行緒進行回收管理。關於他的回收策略JDK給我們提供了不同的預設策略。也支援我們自定義執行緒結構。

到此這篇關於java 執行緒池存在的意義的文章就介紹到這了,更多相關java 執行緒池內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com