1. 程式人生 > >Java執行緒的實現方式

Java執行緒的實現方式

1、繼承Thread類

Thread類本質上是實現了Runnable介面的一個例項,代表了一個執行緒的例項。啟動執行緒的唯一方法就是呼叫Thread類的start()例項方法。start()方法是一個native方法,它將啟動一個新執行緒,並執行run()方法。這種方式實現多執行緒很簡單,通過自己的類直接extend Thread,並複寫run()方法,就可以啟動新執行緒並執行自己定義的run()方法。多個執行緒之間無法共享執行緒類的例項變數。

2、實現Runnable介面

使用Runnable介面建立的多個執行緒是可以共享執行緒類的例項變數,這是因為多個執行緒可以共享同一個target,所以多個執行緒可以共享同一個執行緒類(target類)的例項屬性。
3、通過Executors建立執行緒池
3.1、一個單執行緒的執行緒池。這個執行緒池只有一個執行緒在工作,也就是相當於單執行緒序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼會有一個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。
newSingleThreadExecutor,示例:ExecutorService pool = Executors.newSingleThreadExecutor();
3.2、建立固定大小的執行緒池。每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒。
newFixedThreadPool,示例:ExecutorService pool = Executors.newFixedThreadPool(10);
3.3、建立一個可快取的執行緒池。如果執行緒池的大小超過了處理任務所需要的執行緒,那麼就會回收部分空閒的執行緒,當任務數增加時,此執行緒池又新增新執行緒來處理任務。
newCachedThreadPool,示例:ExecutorService pool = Executors.newCachedThreadPool();
3.4、此執行緒池支援定時以及週期性執行任務的需求
newScheduledThreadPool,示例:ScheduledExecutorService pool = Executors.newScheduledThreadPool(10);

4、自定義執行緒池
public ThreadPoolExecutor(int corePoolSize, //執行緒池大小,一般執行緒池開始時是沒有執行緒的,只有當任務來了並且執行緒數量小於corePoolSize才會建立執行緒
                             int maximumPoolSize, //最大執行緒數,執行緒池能建立的最大執行緒數量
                             long keepAliveTime, //線上程數量超過corePoolSize後,多餘空閒執行緒的最大存活時間
                             TimeUnit unit, //時間單位
                             BlockingQueue<Runnable> workQueue, //存放來不及處理的任務的佇列,是一個BlockingQueue
                             ThreadFactory threadFactory, //生產執行緒的工廠類,可以定義執行緒名,優先順序等
                             RejectedExecutionHandler handler); //拒絕策略,當任務來不及處理的時候,如何處理