Java线程池学习
一、實現Java多線程的方法
1、繼承Thread類創建多線程
Thread類本質實現了Runnable接口。啟動線程為start0()方法。是個native方法。
1 public class ThreadProcess extends Thread { 2 3 @Override 4 public void run(){ 5 long lastTime = System.currentTimeMillis(); 6 for(int i = 0; i < 1; i++){ 7 int ele = Integer.MAX_VALUE; 8 while (ele >= 0){ 9 int ele2 = ele - Integer.MAX_VALUE + 65535 - 37666 + 44443; 10 int temp = Math.max(ele2, ele); 11 if(temp != ele){ 12 temp = ele; 13 } 14 ele = temp-1; 15 } 16 } 17 System.out.println("Time cost from thread " + (System.currentTimeMillis() - lastTime)); 18 } 19 }?
2、實現Runnable。一個類已經繼承了Thread類就無法繼承其它類。
1 class AccountOperator implements Runnable { 2 private int count; 3 private final byte[] lock = new byte[0]; 4 5 public AccountOperator() { 6 this.count = 0; 7 } 8 9 public void run() { 10 synchronized (lock) { 11 count++; 12 System.out.println(Thread.currentThread().getName() + ":" + count); 13 } 14 } 15 }?
3、實現Callable
如果運行完線程并且需要線程返回結果的時候,可以
1 import java.util.concurrent.Callable; 2 3 public class GetDataThread<V> implements Callable<V> { 4 private V v; 5 6 public GetDataThread(V v) { 7 this.v = v; 8 } 9 10 @Override 11 public V call() { 12 return this.v; 13 } 14 } 1 public class Main { 2 public static void main(String[] args) throws Exception{ 3 String data = "data"; 4 FutureTask<String> ft = new FutureTask<>(new GetDataCal<>(data)); 5 Thread t = new Thread(ft); 6 t.start(); 7 String res = ft.get(); 8 System.out.println("Result: " + res); 9 } 10 }?
二、Java線程池
線程的創建和銷毀是需要時間的。記線程創建的時間為T1, 線程運行的時間為T2,線程銷毀的時間為T3。如果T1 + T3 遠遠大于 T2,并且有很多這樣的任務需要并行執行時,就可以使用線程池。
因為通過線程池,線程資源可以重復使用。
?
1、常見的線程池
- newSingleThreadExecutor:創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行
- newFixedThreadExecutor:創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
- newCachedThreadExecutor:??創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程可以無限創建。
- newScheduleThreadExecutor:創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
?
2、首先看下ThreadPoolExecutor方法。構造函數包含了幾個重要參數,
1 public ThreadPoolExecutor(int corePoolSize, 2 int maximumPoolSize, 3 long keepAliveTime, 4 TimeUnit unit, 5 BlockingQueue<Runnable> workQueue 6 RejectedExecutionHandler handler){}?
?
3、先看下線程池的實現原理
提交一個任務到線程池,線程池的處理流程如下
- 判斷核心線程池是否都在執行任務,如果不是,則創建新的線程執行任務
- 若核心線程都在執行任務,判斷工作隊列滿沒滿,如果沒滿,把任務提交給隊列
- 若隊列滿了,判斷線程池里的線程是否都處于工作狀態。如果沒有,則創建一個新的工作線程來執行任務,如果滿了則交給拒絕策略處理
?
轉載于:https://www.cnblogs.com/ylxn/p/10354551.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 【题解】【洛谷 P1967】 货车运输
- 下一篇: ie compatibility