国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 深入java線程池的使用詳解

深入java線程池的使用詳解

2020-12-02 14:39Java教程網 Java教程

本篇文章是對java線程池的使用進行了詳細的分析介紹,需要的朋友參考下

在Java 5.0之前啟動一個任務是通過調用Thread類的start()方法來實現的,任務的提于交和執行是同時進行的,如果你想對任務的執行進行調度或是控制 同時執行的線程數量就需要額外編寫代碼來完成。5.0里提供了一個新的任務執行架構使你可以輕松地調度和控制任務的執行,并且可以建立一個類似數據庫連接 池的線程池來執行任務。這個架構主要有三個接口和其相應的具體類組成。這三個接口是Executor, ExecutorService、ScheduledExecutorService,讓我們先用一個圖來顯示它們的關系:
深入java線程池的使用詳解
圖的左側是接口,圖的右側是這些接口的具體類。注意Executor是沒有直接具體實現的。
Executor接口:是用來執行Runnable任務的,它只定義一個方法:
•execute(Runnable command):執行Ruannable類型的任務
ExecutorService接口:ExecutorService繼承了Executor的方法,并提供了執行Callable任務和中止任務執行的服務,其定義的方法主要有:
•submit(task):可用來提交Callable或Runnable任務,并返回代表此任務的Future對象
•invokeAll(collection of tasks):批處理任務集合,并返回一個代表這些任務的Future對象集合
•shutdown():在完成已提交的任務后關閉服務,不再接受新任務
•shutdownNow():停止所有正在執行的任務并關閉服務。
•isTerminated():測試是否所有任務都執行完畢了。
•isShutdown():測試是否該ExecutorService已被關閉 

ScheduledExecutorService接口在ExecutorService的基礎上,ScheduledExecutorService提供了按時間安排執行任務的功能,它提供的方法主要有:
•schedule(task, initDelay): 安排所提交的Callable或Runnable任務在initDelay指定的時間后執行。
•scheduleAtFixedRate():安排所提交的Runnable任務按指定的間隔重復執行
•scheduleWithFixedDelay():安排所提交的Runnable任務在每次執行完后,等待delay所指定的時間后重復執行。

 
重要的Executors類
雖然以上提到的接口有其實現的具體類,但為了方便Java 5.0建議使用Executors的工具類來得到Executor接口的具體對象,需要注意的是Executors是一個類,不是Executor的復數 形式。Executors提供了以下一些static的方法:
•callable(Runnable task):將Runnable的任務轉化成Callable的任務
•newSingleThreadExecutor:產生一個ExecutorService對象,這個對象只有一個線程可用來執行任務,若任務多于一個,任務將按先后順序執行。
•newCachedThreadPool():產生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據需要調整,線程執行完任務后返回線程池,供執行下一次任務使用。
•newFixedThreadPool(int poolSize):產生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,若任務數量大于poolSize,任務會被放在一個queue里順序執行。
•newSingleThreadScheduledExecutor:產生一個ScheduledExecutorService對象,這個對象的線程池大小為1,若任務多于一個,任務將按先后順序執行。
•newScheduledThreadPool(int poolSize):產生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,若任務數量大于poolSize,任務會在一個queue里等待執行

舉例說明:
應用Executors來建立Thread pool
 
有時候您需要建立一堆Thread來執行一些小任務,然而頻繁的建立Thread有時會是個開銷,因為Thread的建立必須與作業系統互動,如果能建立一個Thread pool來管理這些小的Thread并加以重復使用,對于系統效能會是個改善的方式。
您可以使用Executors來建立Thread pool,Executors有幾個static方法,列出如下:

方法

說明

newCachedThreadPool

建立可以快取的Thread,每個Thread預設可idle 60秒

newFixedThreadPool

包括固定數量的Thread

newSingleThreadExecutor

只有一個Thread,循序的執行指定給它的每個任務

newScheduledThreadPool

可排程的Thread

newSingleThreadScheduledExecutor

單一可排程的Thread


舉個簡單的實例,下面的程式使用newFixedThreadPool方法建立Thread pool,當中包括五個可以重復使用的Thread,您可以指定Runnable物件給它,程式中會產生十個Runnable物件,由于Thread pool中只有五個可用的Thread,所以后來建立的五個Runnable必須等待有空閑的Thread才會被執行:
•ExecutorDemo.java

復制代碼 代碼如下:


package onlyfun.caterpillar;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorDemo {
 public static void main(String[] args) {
  ExecutorService service = Executors.newFixedThreadPool(5);

  for(int i = 0; i < 10; i++) {
   final int count = i;
   service.submit
(new Runnable() {
    public void run() {
     System.out.println(count);
     try {
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }

    }
   });
  }

  service.shutdown(); // 最后記得關閉Thread pool
 }
}


submit()方法也接受實作Callable介面的物件,最后傳回Future物件,可以取得Callable執行過后的傳回結果。如果想利用Executors進行排程,例如排定某個工作30秒后執行:

復制代碼 代碼如下:


ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );       
scheduler.schedule(new Runnable( ) {                              
public void run() {                                  
// 排程工作                              
}                          
},                          
30, TimeUnit.SECONDS);


或排定某個工作5秒后執行,之后每30秒執行一次:

復制代碼 代碼如下:


 final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {                              
 public void run() {                                  
 // 排程工作                                  
 System.out.println("t");                              
 }                          
 },                          
 0, 5, TimeUnit.SECONDS);              
 // 排定 60 秒后取消future       
 scheduler.schedule(new Runnable( ) {           
 public void run( ) {             
 future.cancel(false);           
 }         
 }, 60, TimeUnit.SECONDS);


如上所示,想要取消排程任務,可以呼叫ScheduledFuture的cancel()方法。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 激情五月婷婷在线 | 久久精品中文字幕一区二区 | 午夜国产| 亚洲成人免费影院 | av亚洲在线 | 级毛片| 国产资源在线免费观看 | 日韩精品一区二区三区视频播放 | 免费看国产片在线观看 | 国产三级在线观看 | 午夜播放器在线观看 | 羞羞视频免费观看 | 亚洲专区 中文字幕 | 一区二区三区四区免费 | 国产传媒视频 | www中文字幕在线观看 | 亚洲综合社区 | www免费网站在线观看 | 日日操天天爽 | 精品成人国产在线观看男人呻吟 | 欧美日韩国产精品一区二区 | 国产在线第一页 | av在线精品 | 麻豆国产一区二区三区 | 秋霞av国产精品一区 | 午夜精品成人一区二区 | 久久大陆 | 久久精品影片 | 伊人精品影院 | 亚洲一区二区中文 | 欧美日韩精品 | 亚洲美女精品视频 | 亚洲成人综合网站 | 亚洲国产成人精品女人久久久 | 欧美日韩一区二区三区免费视频 | 一区二区高清 | 国产综合久久久 | 成人二区 | 手机亚洲第一页 | 成人久久久久久久 | 中文字幕在线三区 |