首先要明白什么是線程和進程。
- 進程是什么呢? 進程是計算機中運行的一個應用程序.
- 線程:執行該進程的邏輯單元. 線程是用來執行進程的.
創建線程的四種方式:
繼承Thread類,并復寫run方法,創建該類對象,調用start方法開啟線程。此方式沒有返回值。
實現Runnable接口,復寫run方法,創建Thread類對象,將Runnable子類對象傳遞給Thread類對象。調用start方法開啟線程。此方法2較之方法1好,將線程對象和線程任務對象分離開。降低了耦合性,利于維護。此方式沒有返回值。
創建FutureTask對象,創建Callable子類對象,復寫call(相當于run)方法,將其傳遞給FutureTask對象(相當于一個Runnable)。 創建Thread類對象,將FutureTask對象傳遞給Thread對象。調用start方法開啟線程。這種方式可以獲得線程執行完之后的返回值。該方法使用Runnable功能更加強大的一個子類.這個子類是具有返回值類型的任務方法。
線程池
- 提供了一個線程隊列,隊列中保存著所有等待狀態的線程。避免了創建與銷毀額外開銷,提高了響應的速度。
- 線程池的體系結構:
java.util.concurrent.Executor : 負責線程的使用與調度的根接口
|--**ExecutorService 子接口: 線程池的主要接口
|--ThreadPoolExecutor 線程池的實現類
|--ScheduledExecutorService 子接口:負責線程的調度
|--ScheduledThreadPoolExecutor :繼承 ThreadPoolExecutor, 實現 ScheduledExecutorService - 工具類 : Executors
a) ExecutorService newFixedThreadPool() : 創建固定大小的線程池
b) ExecutorService newCachedThreadPool() : 緩存線程池,線程池的數量不固定,可以根據需求自動的更改數量。
c) ExecutorService newSingleThreadExecutor() : 創建單個線程池。線程池中只有一個線程
d) ScheduledExecutorService newScheduledThreadPool() : 創建固定大小的線程,`與ExecutorService 的區別是還可以延遲或定時的執行任務*。
示例代碼:
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
public class NewThreadDemo {
public static void main(String[] args) throws Exception {
//第一種方式
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("第1種方式:new Thread 1");
}
};
t1.start();
TimeUnit.SECONDS.sleep(1);
//第二種方式
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("第2種方式:new Thread 2");
}
});
t2.start();
TimeUnit.SECONDS.sleep(1);
//第三種方式
FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
String result = "第3種方式:new Thread 3";
return result;
}
});
Thread t3 = new Thread(ft);
t3.start();
// 線程執行完,才會執行get(),所以FutureTask也可以用于閉鎖
String result = ft.get();
System.out.println(result);
TimeUnit.SECONDS.sleep(1);
//第四種方式
ExecutorService pool = Executors.newFixedThreadPool(5);
Future<String> future = pool.submit(new Callable<String>(){
@Override
public String call() throws Exception {
String result = "第4種方式:new Thread 4";
return result;
}
});
pool.shutdown();
System.out.println(future.get());
}
}