python---@property的使用
一 執行緒池的概念
執行緒池,其實就是一個容納多個執行緒的容器,其中的執行緒可以反覆使用,省去了頻繁建立執行緒對
象的操作,無需反覆建立執行緒而消耗過多資源。
在java中,如果每個請求到達就建立一個新執行緒,開銷是相當大的。在實際使用中,建立和銷燬執行緒花費的時間和
消耗的系統資源都相當大,甚至可能要比在處理實際的使用者請求的時間和資源要多的多。除了建立和銷燬執行緒的開銷之
外,活動的執行緒也需要消耗系統資源。如果在一個jvm裡建立太多的執行緒,可能會使系統由於過度消耗記憶體或“切換過度”
而導致系統資源不足。為了防止資源不足,需要採取一些辦法來限制任何給定時刻處理的請求數目,儘可能減少建立和
銷燬執行緒的次數,特別是一些資源耗費比較大的執行緒的建立和銷燬,儘量利用已有物件來進行服務。
執行緒池主要用來解決執行緒生命週期開銷問題和資源不足問題。通過對多個任務重複使用執行緒,執行緒建立的開銷就被分
攤到了多個任務上了,而且由於在請求到達時執行緒已經存在,所以消除了執行緒建立所帶來的延遲。這樣,就可以立即為
請求服務,使用應用程式響應更快。另外,通過適當的調整執行緒中的執行緒數目可以防止出現資源不足的情況。
二 使用執行緒池方式--Runnable介面
通常,執行緒池都是通過執行緒池工廠建立,再呼叫執行緒池中的方法獲取執行緒,再通過執行緒去執行任務方法。
Executors:執行緒池建立工廠類
public static ExecutorService newFixedThreadPool(int nThreads):返回執行緒池物件
ExecutorService:執行緒池類
Future<?> submit(Runnabletask):獲取執行緒池中的某一個執行緒物件,並執行
Future介面:用來記錄執行緒任務執行完畢後產生的結果。執行緒池建立與使用
使用執行緒池中執行緒物件的步驟:
建立執行緒池物件
建立Runnable介面子類物件
提交Runnable介面子類物件
關閉執行緒池
程式碼演示:
public class ThreadPoolDemo {public static void main(String[] args) { //建立執行緒池物件 ExecutorService service = Executors.newFixedThreadPool(2);//包含2個執行緒物件 //建立Runnable例項物件 MyRunnable r = new MyRunnable(); //自己建立執行緒物件的方式 //Thread t = new Thread(r); //t.start(); ---> 呼叫MyRunnable中的run() //從執行緒池中獲取執行緒物件,然後呼叫MyRunnable中的run() service.submit(r); //再獲取個執行緒物件,呼叫MyRunnable中的run() service.submit(r); service.submit(r); //注意:submit方法呼叫結束後,程式並不終止,是因為執行緒池控制了執行緒的關閉。將使用完的執行緒又歸還到了執行緒池中 //關閉執行緒池 //service.shutdown(); } }
public class MyRunnable implements Runnable { @Override public void run() { System.out.println("我要一個教練"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("教練來了: " +Thread.currentThread().getName()); System.out.println("教我游泳,交完後,教練回到了游泳池"); } }
三使用執行緒池方式—Callable介面
Callable介面:與Runnable介面功能相似,用來指定執行緒的任務。其中的call()方法,用來返回執行緒任務執行完畢後的結果,call方法可丟擲異常。
ExecutorService:執行緒池類
<T> Future<T> submit(Callable<T>task):獲取執行緒池中的某一個執行緒物件,並執行執行緒中的call()方法
Future介面:用來記錄執行緒任務執行完畢後產生的結果。執行緒池建立與使用
用執行緒池中執行緒物件的步驟:
建立執行緒池物件
建立Callable介面子類物件
提交Callable介面子類物件
關閉執行緒池
程式碼演示:
public class ThreadPoolDemo { public static void main(String[] args) { //建立執行緒池物件 ExecutorService service = Executors.newFixedThreadPool(2);//包含2個執行緒物件 //建立Callable物件 MyCallable c = new MyCallable(); //從執行緒池中獲取執行緒物件,然後呼叫MyRunnable中的run() service.submit(c); //再獲取個教練 service.submit(c); service.submit(c); //注意:submit方法呼叫結束後,程式並不終止,是因為執行緒池控制了執行緒的關閉。將使用完的執行緒又歸還到了執行緒池中 //關閉執行緒池 //service.shutdown(); } }
Callable介面實現類,call方法可丟擲異常、返回執行緒任務執行完畢後的結果
public class MyCallable implements Callable { @Override public Object call() throws Exception { System.out.println("我要一個教練:call"); Thread.sleep(2000); System.out.println("教練來了: " +Thread.currentThread().getName()); System.out.println("教我游泳,交完後,教練回到了游泳池"); return null; } }