public class MyThread extends Thread { @Override public void run() { // 執行業務邏輯 } public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); } }
public class MyRunnable implements Runnable { @Override public void run() { // 執行業務邏輯 } public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); thread.start(); } }
FutureTask 的出現是爲了彌補 Thread 的不足而設計的,可讓程序員跟蹤、獲取任務的執行狀況、計算結果java
public class MyCallable implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("子線程開始計算"); Thread.sleep(2000); System.out.println("子線程結束計算"); return 100 * 100; } public static void main(String[] args) throws ExecutionException, InterruptedException { // 實例化Callable對象 MyCallable myCallable = new MyCallable(); // 使用FutureTask包裝 FutureTask<Integer> futureTask = new FutureTask<>(myCallable); // 建立一個線程執行任務 Thread thread = new Thread(futureTask); thread.start(); Thread.sleep(1000); System.out.println("主線程執行"); // 使用get()方法會阻塞主線程,直到子線程執行完成返回結果 int result = futureTask.get(); System.out.println("子線程計算結果: " + result); } }
執行結果程序員
子線程開始計算 主線程執行 子線程結束計算 子線程計算結果: 10000
爲何要使用線程池呢?
當不是執行一次性任務的時候,若是不使用線程池,那麼就要頻繁的建立和銷燬線程,這是一個比較消耗資源的操做,使用線程池能夠靈活的調整線程資源的佔用,防止消耗過多的內存
在Java中已經提供了ExecutorSerice、Executors等工具類爲咱們快速的建立線程池
經常使用的常見線程的方法有緩存