實現線程池的幾種方式


進程和線程

說進程之前首先說一下程序,程序是指令和數據的有序集合,本身沒有任何運行的含義,是一個靜態的概念.

進程就是程序的一次執行過程,是一個動態的概念,是系統分配資源的單位.

而一個進程由若干個線程組成,進程中至少要有一個線程,不然就沒有存在的意義,線程是CPU調度和執行的單位.是獨立的執行路徑

第一種實現:

繼承Thread類

package com.lei.thread;

//實現多線程方式一:繼承Thread類
public class Thread1 extends Thread{

   //重寫run方法,編寫線程執行體
   @Override
   public void run() {
       for (int i = 0; i < 1000; i++) {
           System.out.println(Thread.currentThread().getName()+"跟女孩表白");
      }
  }
}

class Test1{
   public static void main(String[] args) {
       //創建線程對象
       Thread1 t1 = new Thread1();
       //調用start方法啟動線程
       t1.start();  //Thread-0跟女孩表白
       t1.run();    //main跟女孩表白
  }
}

注意:線程的run()方法是由java虛擬機直接調用的,如果我們沒有調用線程的start()方法,而是在應用代碼中直接調用run()方法,那么這個線程的run()方法其實運行在當前線程(即run()方法的調用方所在的線程)之中,而不是運行在其自身的線程中,所以不會創建引得線程

如上面代碼:在main方法中執行的run()方法不會創建新的線程,而在main方法中執行的start()方法會啟動一個新的線程,新的線程再去調用run方法

第二種實現:

實現Runnable接口

package com.lei.thread;

//實現多線程方式二:實現Runnable接口
public class Thread2 implements Runnable{

   //重寫run方法,編寫線程執行體
   @Override
   public void run() {
       for (int i = 0; i < 1000; i++) {
           System.out.println(Thread.currentThread().getName()+"跟女孩表白");
      }
  }
}

class Test2{
   public static void main(String[] args) {
       //創建runnable接口的實現類對象
       Thread2 t2 = new Thread2();
       //把runnable接口的實現類丟入要執行的線程中,開啟start方法
       new Thread(t2).start();
  }
}

第三種實現:

實現Callable接口

Callable接口類似於Runnable,兩者都是實現接口,但是Callable的call()方法可以有返回值,並且可以拋出異常。但是Runnable不行。

另外,需要創建一個FutureTask對象用來獲取結果以及傳遞參數給線程對象

package com.lei.thread;

import java.util.concurrent.*;

//實現多線程方式三:實現Callable接口,這里的泛型是返回值的類型
public class Thread3 implements Callable<String> {

   //重寫call方法,拋出異常,編寫線程執行體,
   @Override
   public String call() throws Exception {
       for (int i = 0; i < 100; i++) {
           System.out.println("跟女孩表白" + i);
      }
       return "答應";
  }

}

class Test3{
   public static void main(String[] args) throws ExecutionException, InterruptedException {
       //線程開啟之后需要執行里面的call方法
       Thread3 t3 = new Thread3();
       //可以獲取線程執行完畢之后的結果,也可以作為參數傳遞給Thread對象
       FutureTask<String> futureTask = new FutureTask(t3);
       //創建線程對象
       Thread thread = new Thread(futureTask);
       //開啟線程
       thread.start();
       //獲取執行結果
       String result = futureTask.get();
       System.out.println(result);
  }
}

第四種實現

線程池方式

package com.lei.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Thread4 implements Runnable{

   @Override
   public void run() {
       System.out.println(Thread.currentThread().getName()+"跟女孩表白");
  }
}

class Test4{
   public static void main(String[] args) {
       //創建線程池,參數為線程池的大小
       ExecutorService executorService = Executors.newFixedThreadPool(6);
       //執行
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       executorService.execute(new Thread4());
       //關閉線程池
       executorService.shutdown();
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM