用 J2SE1.5 建立多任務的Java應用程式

來源:互聯網
上載者:User

來源:http://www.study-code.com/java/j2se/66423.htm

J2SE 5.0中的java.util.concurrent程式包提供了一個新的線程架構組件,這個架構組件處理了與建立、執行和管理線程相關的很多低層細節資訊。在本文中我們將細緻地瞭解一下它的重要特性。

  如果你使用C、C++或Java先前的版本進行多線程編程,就知道在代碼中管理線程是多麼頭疼的事情。在單線程程式中,代碼中引起應用程式失敗的 bug每次都在同一個點出現。但是在多線程程式中,只有某些原因遇到一起的時候才會出現失敗。由於預見可能引發應用程式失敗的所有條件是非常困難的,所以多線程編程是有挑戰性的。有些程式員從根本上避免這種挑戰,而另外一些--聰明的解決問題的人員--則一直坐在他們的電腦面前直到問題解決。

  J2SE 5.0平台包含了一個新的並發工具程式包。這個程式包中的類替並發類(concurrent classe)或並發設計中使用的應用程式建立阻塞(blocking)。該並發工具包含下面一些內容:

· 高效能的、靈活的線程池

· 非同步執行事務的架構組件

· 為並發訪問最佳化過的集合類宿主(host)

  本文介紹了J2SE 5.0架構組件類和它們的重要特性。本文的下載代碼提供了一些簡單的、容易使用的樣本,它示範了所有的新線程架構組件類。你在閱讀文章內容之後運行這些樣本可以使自己對這些特性有更好的理解。

Executor(執行器)架構組件

  Executor架構組件提供了一個簡單的、標準的、可擴充的類,它提供了一些有用的功能,如果沒有這些功能,我們要手工實現這些它們,會覺得十分單調和困難。該架構組件使調用、調度和執行的操作標準化了。它通過一組執行策略為控制非同步事務提供了支援。

  Executor介面執行已提交的可以啟動並執行事務。它提供了一條途徑,允許我們把事務提交從事務執行機制中分離出來。程式員通常使用Executor代替顯式地(explicitly)建立線程。Executor介面也提供事務的同步和非同步執行。

對於同步執行,使用下面的命令:

Class MySynExecutor implements Executor{
public void execute(Runnable r) {
r.run();
}
}

對於非同步執行,使用下面的命令:

Class MyASynExecutor implements Executor{
public void execute(Runnable r) {
new Thread(r).start();
}
}

ExecutorService(執行器服務)類

  ExecutorService類為管理一個或多個非同步事務的終止和跟蹤事務執行的過程提供了方法。代碼下載中的 MyExecutorService.java檔案示範了管理事務終止的過程。它初始化了大小為三個的線程池,然後依次添加了線程。當線程的數量達到線程池的大小限制時,它調用關閉(shutdown)方法。在調用shutdown()方法之後,這個線程池不再接受新事務的執行。在等待十秒以後,該線程池調用shutDownNow()。這個方法會盡最大的努力來終止所有運行中的事務。在樣本中,應用程式試圖終止運行中的線程失敗了。

ScheduledExecutorService(調度執行器服務)

  ScheduledExecutorService類是我的最喜歡的類。它對於調度那些周期性執行的事務非常方便,而周期性執行的事務對於清除工作(例如清除你的應用程式建立的臨時檔案等等)尤其有用。下載代碼中的MyScheduledExecutorService.java檔案通過每五秒鐘發出"嘟嘟"一聲示範了調度的過程:

final Runnable beeper = new Runnable() {
public void run() { System.out.println("beep"); }
};
final ScheduledFuture beeperHandle=scheduler.scheduleAtFixedRate(beeper, 1, 5, SECONDS);

Future和FutureTask

  在Java的早期版本中,查詢運行中的線程狀態,以及使線程在執行之後返回一個值是非常困難的。由於run(運行)方法返回void,你必須編寫大量的代碼從線程中返回一個值。使用過這種方法的程式員肯定瞭解其痛苦的經曆。

  你可以使用Future介面或者FutureTask類從非同步執行的線程中得到一個傳回值。Future介面提供了檢查計算過程是否完成、檢索計算結果或終止計算過程的一些方法。FutureTask類提供了Future介面方法的基本實現(implementation)。只有計算過程完成以後才能檢索結果;如果計算過程沒有完成,get方法會被阻塞(block)。

  下載代碼中的MyStringReverser.java檔案示範了FutureTask類的使用,並提供了一個容易理解的樣本。它以每秒鐘一個字元的速度從後向前顯示提交的字串,同時主線程檢測事務是否完成了:

while(!future.isDone()){
System.out.println("Task not yet completed.");
try{
Thread.currentThread().sleep(500);
}catch(InterruptedException ie){
System.out.println("Will check after 1/2 sec.");
}
}

  在事務完成以後,就使用get方法從Future對象中檢索結果:

System.out.println("Here is result..."+future.get());

ThreadPoolExecutor(線程池執行器)

  有了ThreadPoolExecutor類之後你可以編寫自己的伺服器了。這個類為配置和調整伺服器提供了很多的特性,與很多大規模的企業級EJB伺服器相似。下面是它的一些配置參數:

· 核心和最大的線程池大小

  通過把corePoolSize和maximumPoolSize設定為相同的值,你就可以建立一個大小固定的線程池了。通過把 maximumPoolSize設定為一個極大的值(例如Integer.MAX_VALUE),你就可以允許線程池容納任意數量的並發事務了。

· 根據需要構造

  在預設情況下,只有在新事務要求的時候,ThreadPoolExecutor才開始建立和啟動核心的線程,但是你可以使用prestartCoreThread或prestartAllCoreThreads動態地重載它。

· 保持活動的時間

  如果線程池中當前線程的數量超過了corePoolSize,那麼這些超過的線程的空閑時間大於keepAliveTime的時候,它們就會被終止。

· 排隊

  排隊遵循下面的規則:

· 如果正在啟動並執行線程數量少於corePoolSize,Executor總會添加新線程而不會排隊。

· 如果corePoolSize或更多數量的線程在運行,Executor總會對請求進行排隊而不會添加新線程。

· 如果某個請求不能參與排隊,就會建立新線程,除非線程數量超過了maximumPoolSize(在超過的情況下,該事務會被拒絕)。

· Hook方法

  這個類提供了beforeExecute()和afterExecute() hook方法,它們分別在每個事務執行之前和之後被調用。為了使用它們,你必須建立這個類的子類(因為這些方法是受保護的)。

  下載代碼中的MyThreadPoolExecutor.java提供了一些監視多種配置參數的詳細樣本。你可以發現隨著每個事務的增加和完成,線程池和隊列大小在不斷變化。你可以修改代碼中的設定資訊。 並發集合

  JDK 1.5提供了下面一些集合實現,它們是被設計為用於多線程環境的:

· ConcurrentHashMap

· CopyOnWriteArrayList

· CopyOnWriteArraySet

  ConcurrentHashMap類為檢索和更新(update)可調整的預期的並發性提供了完整的安全執行緒的(thread-safe)並發性支援。CopyOnWriteArraySet是一組安全執行緒的變數集合,CopyOnArrayList是一個安全執行緒的數組列表(ArrayList)變數。在修改原始的數組或集合之前,它們中的每一個都會把下層的數組或集合複製一份。其結果是,讀取的速度很快,而更新的速度很慢。

  並發集合類為Iterator(迭代子)提供快照式的資料(即使下層資料發生了改變,在Iterator中也不會反映出來)。

同步器(Synchronizer)

  JDK 1.5還提供了一些進階類,例如Semaphore、CountDownLatch和CyclicBarrier,還有一個用於同步的Exchanger(交換器)類。本文沒有介紹這些類的詳細的分析和使用資訊,因為理解它們需要一些理論背景。

  擁有了這些新的類之後,你可以說服害怕多線程技術的技術上司開發多線程應用程式了。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.