JDK5.0以後的版本都引入了高級併發特性,大多數的特性在java.util.concurrent 包中,是專門用於多線程發編程的,充分利用了現代多處理器和多核心繫統的功能以編寫大規模併發應用程序。主要包含原子量、併發集合、同步器、可重入鎖,並對線程池的構造提供
了強力的支持。
線程池的5中創建方式:
1、 Single Thread Executor : 只有一個線程的線程池,因此所有提交的任務是順序執行,
代碼: Executors.newSingleThreadExecutor()
2、 Cached Thread Pool : 線程池裏有很多線程需要同時執行,老的可用線程將被新的任務觸發重新執行,如果線程超過60秒內沒執行,那麼將被終止並從池中刪除,
代碼:Executors.newCachedThreadPool()
3、 Fixed Thread Pool : 擁有固定線程數的線程池,如果沒有任務執行,那麼線程會一直等待,
代碼: Executors.newFixedThreadPool(4)
在構造函數中的參數4是線程池的大小,你可以隨意設置,也可以和cpu的核數量保持一致,獲取cpu的核數量int cpuNums =Runtime.getRuntime().availableProcessors();
4、 Scheduled Thread Pool : 用來調度即將執行的任務的線程池,可能是不是直接執行, 每隔多久執行一次... 策略型的
代碼:Executors.newScheduledThreadPool()
5、 Single Thread Scheduled Pool : 只有一個線程,用來調度任務在指定時間執行,代碼:Executors.newSingleThreadScheduledExecutor()
線程池的使用
提交 Runnable ,任務完成後Future 對象返回 null
調用excute,提交任務, 匿名Runable重寫run方法, run方法裏是業務邏輯
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolWithRunable {
/**
* 通過線程池執行線程
* @param args
*/
public static void main(String[] args) {
//創建一個線程池
ExecutorService pool = Executors.newCachedThreadPool();
for(int i = 1; i < 5; i++){
pool.execute(new Runnable() {
@Override
public void run() {
System.out.println("thread name: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
pool.shutdown();
}
}
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* callable 跟runnable的區別:
* runnable的run方法不會有任何返回結果,所以主線程無法獲得任務線程的返回值
*
* callable的call方法可以返回結果,但是主線程在獲取時是被阻塞,需要等待任務線程返回才能拿到結果
* @author
*
*/
public class ThreadPoolWithcallable {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService pool = Executors.newFixedThreadPool(4);
for(int i = 0; i < 10; i++){
Future<String> submit = pool.submit(new Callable<String>(){
@Override
public String call() throws Exception {
//System.out.println("a");
Thread.sleep(5000);
return "b--"+Thread.currentThread().getName();
}
});
//從Future中get結果,這個方法是會被阻塞的,一直要等到線程任務返回結果
System.out.println(submit.get());
}
pool.shutdown();
}
}
提交 Callable,該方法返回一個 Future 實例表示任務的狀態
調用submit提交任務, 匿名Callable,重寫call方法, 有返回值, 獲取返回值會阻塞,一直要等到線程任務返回結果