亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

JAVA認證

構(gòu)建多線程Java應用程序

時間:2024-10-06 22:03:04 JAVA認證 我要投稿
  • 相關(guān)推薦

構(gòu)建多線程Java應用程序

  大多數(shù)服務端應用程序都需要同時處理任務的能力,這樣可以提高工作性能并增加硬件資源的利用。在早期的Java版本(1.4或更早的)中,開發(fā)者需要完成并發(fā)(concurrent)應用程序——包括線程池邏輯—他們自己使用的是低層次語言結(jié)構(gòu)和Java Thread API.但是結(jié)果卻總是不理想。Java Thread API的特性會導致不知情的編程者開發(fā)一些難以調(diào)試的編程錯誤的代碼。

  在Java5.0中,Sun公司采用了Java concurrency功能(JSR-166)來解決這些問題,并且提供了一套標準的APIs來創(chuàng)建并開發(fā)應用程序。本文探究了一些Java concurrency package提供的特性并使用這些功能來演示編寫并發(fā)應用程序的技術(shù)。

  Concurrent Programming的挑戰(zhàn)

  自從它發(fā)布以來,Java就提供了Thread類和低層次語言結(jié)構(gòu),例如synchronized 和volatile用來開發(fā)獨立平臺的并發(fā)應用程序。但是,用這些特性來構(gòu)建并發(fā)應用程序并不是簡單的事情。開發(fā)者要面對以下的挑戰(zhàn):

  不正確的編程會導致一些困境,就是兩個或兩個以上的線程都等待永遠被鎖住的對方。

  在Java語言中沒有機制用于寫wait-free, lock-free算法。開發(fā)者必須使用本地代碼。

  開發(fā)者必須編寫他們復雜的線程池邏輯,這樣會很棘手并且容易出錯。

  Java Concurrency Utilities的概述

  JSR-166(Java concurrency utilities),是Java5.0的一部分,通過著重在寬度并提供跨域大范圍并發(fā)編程風格的重要功能,大大簡化了在Java中并發(fā)應用程序的開發(fā)。

  Java concurrency utilities提供了多種功能,開發(fā)者可以應用于更快更有預見性的并發(fā)應用程序的開發(fā)。這些功能讓開發(fā)者從通過寫自定義代碼來重新發(fā)明wheel中解放出來。一些JSR-166的最顯著的特點是:

  標準的接口和構(gòu)架來定義自定義線程子系統(tǒng)。

  是一種機制用于規(guī)范調(diào)用,時序安排,執(zhí)行和異步任務的控制,這是根據(jù)在Executor構(gòu)架中的一套執(zhí)行政策。

  是一種機制通過類用于線程協(xié)調(diào),例如semaphore, mutexe, barrier, latche和 exchangers.

  非阻礙FIFO列隊執(zhí)行(ConcurrentLinkedQueue類)用于可升級的,有效的線程安全操作。

  阻礙列隊執(zhí)行類來涵蓋最常見的使用情況,對于生成者/消費者方法,信息,并行任務和相關(guān)的并發(fā)設(shè)計。

  是一種構(gòu)架用于鎖定和等待不同于內(nèi)置同步和監(jiān)測器的條件。

  隨時準備使用的類用于在單個變量上的鎖定自由,線程安全的編程。

  開發(fā)一個Concurrent Java Application

  本節(jié)是演示如何使用Java concurrency utility API來開發(fā)一個多線程的在線訂單程序的電子商務應用程序。在應用程序生效并授權(quán)命令之后,把它們放在訂單處理列隊(java.util.concurrent.BlockingQueue)。訂單處理器線程池不斷的對訂單進行測驗,而且當這些訂單可以使用時進行處理。

  解耦應用程序的訂單處理代碼提供了增加和減少訂單處理率的靈活性,通過改變線程池的大小。在一個并發(fā)BlockingQueue中放入訂單對象確保一個處理器處理一個訂單,而且它要照顧自動同步。

  在以下小節(jié)中的代碼段是截取于伴隨本文中的應用程序源代碼。

  擴展ThreadPoolExecutor

  Executor接口只規(guī)定了一個方法并從任務如何運行中解耦任務提交。ExecutorService子接口規(guī)定了額外的方法用于提交并追蹤異步任務,以及關(guān)閉線程池。ThreadPoolExecutor類是ExecutorService接口的一個具體的執(zhí)行,應該足以用于大多數(shù)訂單處理應用程序的需求。

  ThreadPoolExecutor也提供有用的連接方法(e.g., beforeExecute),可以覆蓋定制目的。在Listing 1中的CustomThreadPoolExecutor類擴展了ThreadPoolExecutor類并覆蓋了beforeExecute, afterExecute和 terminated 方法。

   @Override

  public void afterExecute(Runnable r, Throwable t) {

  super.afterExecute(r, t);

  Logger.log("After calling afterExecute() method for a thread "

  + r);

  }

  @Override

  public void terminated() {

  super.terminated();

  Logger.log("Threadpool terminated");

  }

  該覆蓋方法只需登陸復寫信息,但是在現(xiàn)實的情況中,它們能做更有用的事情。例如,terminated方法可以發(fā)送一個在這個池中的所有線程都死鎖的警告。要正確構(gòu)建多重覆蓋,通常你應該從在子類中的各個方法中調(diào)用主類的覆蓋方法。

  Java concurrency API還提供了ScheduledExecutorService接口,可以擴展ExecutorServiceInterface,而且在一個特定延遲或是定期的執(zhí)行之后能夠安排任務進行運行。ScheduledExecutorThreadPool是這個接口的具體執(zhí)行。確定異步任務執(zhí)行

  Executor 執(zhí)行提交異步任務,這些任務執(zhí)行實際的業(yè)務邏輯。向executor提交一個任務,ExecutorService接口提供重載的submit方法,可以接受Runnable 或是Callable 對象類型。

  Runnable任務類型在以下情況下市非常有用的:

  任務完成時不需要返回任何結(jié)果。

  如果run()方法遇到一個例外,沒有必要拋出一個特定程序檢查例外。

  移植現(xiàn)有的legacy 類來實施Runnable接口是必需的。

  Callable任務類型提供了更多靈活性并提供了下列的優(yōu)點:

  任務可以返回用戶定義對象作為結(jié)果。

  任務可以拋出用戶定義的檢查例外。

  你需要分別為Runnable 和Callable任務類型執(zhí)行run() 和call()方法。

  在Listing 2中的OrderProcessorCallable類執(zhí)行Callable接口并指定一個Integer作為結(jié)果對象。Constructor把任務對象名稱和BlockingQueue當做檢索命令來處理。call()方法繼續(xù)為訂單值對象調(diào)查BlockingQueue,并且處理任何所它所發(fā)現(xiàn)的事情。如果沒有訂單處理,call()方法會休息一段時間再繼續(xù)工作。

  Call方法的無限循環(huán)在這個應用程序方案中是非常有用的,因為因為沒有必要一次又一次為每個訂單對象去創(chuàng)建并提交新的任務到ThreadPoolExecutor中。

   public Integer call() throws OrderProcessingException {

  while (running) {

  // check if current Thread is interrupted

  checkInterruptStatus();

  // poll for OrderVO from blocking queue and do

  // order processing here

  ……

  }

  // return result

  return processedCount;

  }

  請注意異步任務執(zhí)行不斷的為應用程序的生命周期運行。在大多數(shù)程序中,異步任務執(zhí)行會進行必要的操作并立即返回。

  處理線程中斷

  Call方法執(zhí)行使用checkInterruptStatus方法在執(zhí)行線程中斷上進行經(jīng)常性檢查。這是必需的因為為了迫使任務取消,ThreadPoolExecutor會向線程發(fā)送一個interrupt.否則檢查中斷狀態(tài)會導致特定線程再也無法返回。以下的checkInterruptStatus方法檢查運行線程的中斷狀態(tài),如果線程被中斷會拋出OrderProcessingException.

  private void checkInterruptStatus() throws

  OrderProcessingException {

  if (Thread.interrupted()) {

  throw new OrderProcessingException("Thread was interrupted");

  }

  }

  作為任務的實施,它是拋出一個異常并在運行線程被中斷的時候終止任務執(zhí)行的一個非常好的練習。但是,基于訂單處理的應用程序需求,在這種情況下忽略線程中斷是非常恰當?shù)摹?/p>

【構(gòu)建多線程Java應用程序】相關(guān)文章:

Java多線程的實現(xiàn)方式11-03

java多線程面試題201707-27

2024年java多線程面試題及答案09-04

sun認證考試輔導:java關(guān)于多線程的部分操作07-25

PHP Curl多線程原理詳解09-16

Excel2010的多線程計算10-11

ASP應用程序的維護方法10-07

Java與Java web的區(qū)別08-22

Java與Java web有什么不同01-22

未來郵件營銷應用程序的4個爆發(fā)點09-07