在上一篇文章中,講述了線程的基本概念和用法,這里將繼續講述線程組和線程池的一些東西。
線程組:java.lang.ThreadGroup
1. 線程組的介紹
線程組表示一個線程的集合。此外,線程組也可以包含其他線程組。線程組構成一棵樹,在樹中,除了初始線程組外,每個線程組都有一個父線程組。允許線程訪問有關自己的線程組的信息,但是不允許它訪問有關其線程組的父線程組或其他任何線程組的信息。
2. 線程組的構造方法
ThreadGroup(String name)
構造一個新線程組。
ThreadGroup(ThreadGroup parent, String name)
創建一個新線程組。
上述第二個構造方法可以指定新創建的線程組的父親線程組並指定當前線程組的名稱。
3. 線程組的常用方法
線程組的常用方法和線程的常用方法一致,不過線程組執行方法影響的目標是線程組或者線程組內的具體的每個線程,例如setDaemon方法,在Thread中是表示將該現場設為守護線程,在剩下的只有守護線程是,JVM自動退出,而在線程組中,表示該組內最后一個現場銷毀時,自動銷毀該線程組。而interrupt這樣的方法則表示中斷該線程組中的所有線程。
4. 如何設置線程屬於哪個組
Thread的構造方法中提供了設置線程組的構造方法,如下所示:
Thread(ThreadGroup group, Runnable target) 分配新的 Thread 對象。 Thread(ThreadGroup group, Runnable target, String name) 分配新的 Thread 對象,以便將 target 作為其運行對象,將指定的 name 作為其名稱,並作為 group 所引用的線程組的一員。 Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配新的 Thread 對象,以便將 target 作為其運行對象,將指定的 name 作為其名稱,作為 group 所引用的線程組的一員,並具有指定的堆棧大小。 Thread(ThreadGroup group, String name) 分配新的 Thread 對象。
線程池:ExecutorService
1. 如何創建線程池對象
public static ExecutorService newFixedThreadPool(int nThreads)
該方法是Executors下的一個靜態方法,Executors中所定義的 Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 和 Callable 類的工廠和實用方法。
2. 如何提交線程執行
<T> Future<T> submit(Callable<T> task) 提交一個返回值的任務用於執行,返回一個表示任務的未決結果的 Future。 Future<?> submit(Runnable task) 提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future。
3. 如何結束線程池
void shutdown() 啟動一次順序關閉,執行以前提交的任務,但不接受新任務。 List<Runnable> shutdownNow() 試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。
4. Future是啥,有什么作用
Future 是一個接口,它表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。計算完成后只能使用 get 方法來獲取結果,如有必要,計算完成前可以阻塞此方法。取消則由 cancel 方法來執行。還提供了其他方法,以確定任務是正常完成還是被取消了。一旦計算完成,就不能再取消計算。如果為了可取消性而使用 Future 但又不提供可用的結果,則可以聲明 Future<?> 形式類型、並返回 null 作為底層任務的結果。那如何取得一個提交線程的運行結果呢?
我們知道Runnable中不提供線程結果的返回方法,所以我們要尋求新的工具類或者接口,它就是Callable。
Callable 接口類似於 Runnable,兩者都是為那些其實例可能被另一個線程執行的類設計的。但是 Runnable 不會返回結果,並且無法拋出經過檢查的異常。
5. Callable的應用--異步求和案例
import java.util.concurrent.*; public class ThreadTest { public static void main(String args[]) throws ExecutionException, InterruptedException { // 可以執行Runnable對象或者Callable對象代表的線程 ExecutorService pool = Executors.newFixedThreadPool(2); Future<Integer> f1 = pool.submit(new MyCallable(100)); Future<Integer> f2 = pool.submit(new MyCallable(200)); // V get() Integer i1 = f1.get(); Integer i2 = f2.get(); System.out.println(i1); System.out.println(i2); // 結束 pool.shutdown(); } } class MyCallable implements Callable<Integer> { private int number; public MyCallable(int number) { this.number = number; } @Override public Integer call() throws Exception { int sum = 0; for (int x = 1; x <= number; x++) { sum += x; } return sum; } }