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

java語言

Java 5線程池使用

時間:2024-07-28 19:00:42 java語言 我要投稿
  • 相關(guān)推薦

Java 5線程池使用

  線程池為線程生命周期開銷問題和資源不足問題提供了解決方案。通過對多個任務(wù)重用線程,線程創(chuàng)建的開銷被分攤到了多個任務(wù)上。其好處是,因為在請求到達時線程已經(jīng)存在,所以無意中也消除了線程創(chuàng)建所帶來的延遲。一起看看吧!

  線程池是Java5提供的一個新技術(shù),方便我們快速簡潔的定義線程池。包括如下:

  諸如 Web 服務(wù)器、數(shù)據(jù)庫服務(wù)器、文件服務(wù)器或郵件服務(wù)器之類的許多服務(wù)器應(yīng)用程序都面向處理來自某些遠程來源的大量短小的任務(wù)。請求以某種方式到達服務(wù)器,這種方式可能是通過網(wǎng)絡(luò)協(xié)議(例如 HTTP、FTP 或 POP)、通過 JMS 隊列或者可能通過輪詢數(shù)據(jù)庫。不管請求如何到達,服務(wù)器應(yīng)用程序中經(jīng)常出現(xiàn)的情況是:單個任務(wù)處理的時間很短而請求的數(shù)目卻是巨大的。

  構(gòu)建服務(wù)器應(yīng)用程序的一個過于簡單的模型應(yīng)該是:每當一個請求到達就創(chuàng)建一個新線程,然后在新線程中為請求服務(wù)。實際上,對于原型開發(fā)這種方法工作得很好,但如果試圖部署以這種方式運行的服務(wù)器應(yīng)用程序,那么這種方法的嚴重不足就很明顯。每個請求對應(yīng)一個線程(thread-per-request)方法的不足之一是:為每個請求創(chuàng)建一個新線程的開銷很大;為每個請求創(chuàng)建新線程的服務(wù)器在創(chuàng)建和銷毀線程上花費的時間和消耗的系統(tǒng)資源要比花在處理實際的用戶請求的時間和資源更多。

  除了創(chuàng)建和銷毀線程的開銷之外,活動的線程也消耗系統(tǒng)資源。在一個 JVM 里創(chuàng)建太多的線程可能會導致系統(tǒng)由于過度消耗內(nèi)存而用完內(nèi)存或“切換過度”。為了防止資源不足,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定時刻處理的請求數(shù)目。

  線程池為線程生命周期開銷問題和資源不足問題提供了解決方案。通過對多個任務(wù)重用線程,線程創(chuàng)建的開銷被分攤到了多個任務(wù)上。其好處是,因為在請求到達時線程已經(jīng)存在,所以無意中也消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務(wù),使應(yīng)用程序響應(yīng)更快。而且,通過適當?shù)卣{(diào)整線程池中的線程數(shù)目,也就是當請求的數(shù)目超過某個閾值時,就強制其它任何新到的請求一直等待,直到獲得一個線程來處理為止,從而可以防止資源不足。

  Java5提供以下線程池:

  緩存線程池(newCachedThreadPool),可以創(chuàng)建任意個線程,每個任務(wù)過來后都會創(chuàng)建一個線程,用于任務(wù)少,或執(zhí)行時間短的任務(wù),例如我們創(chuàng)建十個任務(wù),那么緩沖線程池將會創(chuàng)建十個線程來執(zhí)行。如下代碼:

  ExecutorService threadPool = Executors.newCachedThreadPool();

  for(int i=1; i<=10; i++){

  final int taskId = i;

  threadPool.execute(new Runnable(){

  public void run() {

  for(int i=1; i<=10; i++){

  System.out.println(Thread.currentThread().getName() + " is looping of " + i + " the task is " + taskId);

  try {

  Thread.sleep(20);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

  });

  }

  System.out.println("add all of 10 task");

  threadPool.shutdown();

  固定數(shù)量線程池(newFixedThreadPool)允許我們創(chuàng)建固定線程數(shù)量的線程池,如果任務(wù)數(shù)大于線程池中線程的數(shù)量,那么任務(wù)將等待,如下代碼:

  ExecutorService threadPool = Executors.newFixedThreadPool(3);

  for(int i=1; i<=10; i++){

  final int taskId = i;

  threadPool.execute(new Runnable(){

  public void run() {

  for(int i=1; i<=10; i++){

  System.out.println(Thread.currentThread().getName() + " is looping of " + i + " the task is " + taskId);

  try {

  Thread.sleep(20);

  } catch (InterruptedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  }

  }

  });

  }

  System.out.println("add all of 10 task");

  threadPool.shutdown();

  如何實現(xiàn)線程掛掉后重新啟動(創(chuàng)建單一的線程池)newSingleThreadExecutor(),這樣線程池中只會有一個線程工作,當線程失敗后會重新創(chuàng)建一個線程將失敗的線程替換掉。

  定時器線程池(scheduleAtFixedRate)與定時器很類似,可以指定線程池中線程在多長時間后執(zhí)行,以及每個多長時間執(zhí)行一次,代碼如下,可以模擬讓炸 彈在6s后爆炸,并且每個2s炸一次:

  Executors.newScheduledThreadPool(3).scheduleAtFixedRate(

  //  .schedule(

  new Runnable(){

  public void run() {

  System.out.println("boming");

  }

  }, 6, 2, TimeUnit.SECONDS);

  }

  大家可以執(zhí)行代碼測試。

【Java 5線程池使用】相關(guān)文章:

什么是java線程池框架10-02

java線程池框架解析09-11

java線程池框架是什么09-03

java線程池框架解析方法10-13

如何使用java多線程08-23

java中通用的線程池實例代碼08-27

淺談如何使用java多線程10-17

java的多線程09-09

java多線程08-31

java多線程介紹08-23