欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例

 更新時間:2014年01月16日 09:34:51   作者:  
在Java 5.0之前啟動一個任務(wù)是通過調(diào)用Thread類的start()方法來實現(xiàn)的,5.0里提供了一個新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務(wù),下面看一個示例

復(fù)制代碼 代碼如下:

package com.yao;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 新的任務(wù)執(zhí)行架構(gòu)。
 * 在Java 5.0之前啟動一個任務(wù)是通過調(diào)用Thread類的start()方法來實現(xiàn)的,
 * 任務(wù)的提于交和執(zhí)行是同時進行的,如果你想對任務(wù)的執(zhí)行進行調(diào)度,
 * 或是控制同時執(zhí)行的線程數(shù)量就需要額外編寫代碼來完成。
 * 5.0里提供了一個新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,
 * 并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務(wù)。
 * 這個架構(gòu)主要有三個接口和其相應(yīng)的具體類組成。
 * 這三個接口是Executor, ExecutorService和ScheduledExecutorService。
 * (1)Executor接口:是用來執(zhí)行Runnable任務(wù)的,它只定義一個方法:
 * execute(Runnable command):執(zhí)行Ruannable類型的任務(wù)
 * (2)ExecutorService:繼承了Executor的方法,并提供了執(zhí)行Callable任務(wù)和中止任務(wù)執(zhí)行的服務(wù),
 * 其定義的方法主要有:
 * submit(task):可用來提交Callable或Runnable任務(wù),并返回代表此任務(wù)的Future對象
 * invokeAll(collection of tasks):批處理任務(wù)集合,并返回一個代表這些任務(wù)的Future對象集合
 * shutdown():在完成已提交的任務(wù)后關(guān)閉服務(wù),不再接受新任務(wù)
 * shutdownNow():停止所有正在執(zhí)行的任務(wù)并關(guān)閉服務(wù)。
 * isTerminated():測試是否所有任務(wù)都執(zhí)行完畢了。
 * isShutdown():測試是否該ExecutorService已被關(guān)閉
 * (3)ScheduledExecutorService:繼承ExecutorService,提供了按時間安排執(zhí)行任務(wù)的功能、
 * schedule(task, initDelay): 安排所提交的Callable或Runnable任務(wù)在initDelay指定的時間后執(zhí)行。
 * scheduleAtFixedRate():安排所提交的Runnable任務(wù)按指定的間隔重復(fù)執(zhí)行
 * scheduleWithFixedDelay():安排所提交的Runnable任務(wù)在每次執(zhí)行完后,等待delay所指定的時間后重復(fù)執(zhí)行。
 *
 * 通過Executors類來獲得各種服務(wù)對象。
 * callable(Runnable task): 將Runnable的任務(wù)轉(zhuǎn)化成Callable的任務(wù)
 * newSingleThreadExecutor: 產(chǎn)生一個ExecutorService對象,這個對象只有一個線程可用來執(zhí)行任務(wù),若任務(wù)多于一個,任務(wù)將按先后順序執(zhí)行。
 * newCachedThreadPool(): 產(chǎn)生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據(jù)需要調(diào)整,線程執(zhí)行完任務(wù)后返回線程池,供執(zhí)行下一次任務(wù)使用。
 * newFixedThreadPool(int poolSize):產(chǎn)生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,若任務(wù)數(shù)量大于poolSize,任務(wù)會被放在一個queue里順序執(zhí)行。
 * newSingleThreadScheduledExecutor:產(chǎn)生一個ScheduledExecutorService對象,這個對象的線程池大小為1,若任務(wù)多于一個,任務(wù)將按先后順序執(zhí)行。
 * newScheduledThreadPool(int poolSize): 產(chǎn)生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,若任務(wù)數(shù)量大于poolSize,任務(wù)會在一個queue里等待執(zhí)行
 */
public class ExecuteArch {

 /**
  * 該線程輸出一行字符串
  */
 public static class MyThread implements Runnable {
  public void run() {
   System.out.println("Task repeating. " + System.currentTimeMillis());
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    System.out.println("Task interrupted. "
      + System.currentTimeMillis());
   }
  }
 }

 /**
  * 該Callable結(jié)束另一個任務(wù)
  */
 public static class MyCallable implements Callable {
  private Future future;

  public MyCallable(Future future) {
   this.future = future;
  }

  public String call() {
   System.out.println("To cancell Task..."
     + +System.currentTimeMillis());
   this.future.cancel(true);
   return "Task cancelled!";
  }
 }

 /**
  * @param args
  * @throws ExecutionException
  * @throws InterruptedException
  */
 public static void main(String[] args) throws InterruptedException,
   ExecutionException {
  // 產(chǎn)生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據(jù)需要調(diào)整,
  // 線程執(zhí)行完任務(wù)后返回線程池,供執(zhí)行下一次任務(wù)使用。
  ExecutorService cachedService = Executors.newCachedThreadPool();
  Future myThreadFuture = cachedService.submit(new MyThread());
  Future myCallableFuture = cachedService.submit(new MyCallable(
    myThreadFuture));
  System.out.println(myCallableFuture.get());
  System.out.println("-----------------");

  // 將Runnable任務(wù)轉(zhuǎn)換成Callable任務(wù)
  Callable myThreadCallable = Executors.callable(new MyThread());
  Future myThreadCallableFuture = cachedService.submit(myThreadCallable);
  // 對于Runnable任務(wù),轉(zhuǎn)換成Callable任務(wù)后,也沒有返回值
  System.out.println(myThreadCallableFuture.get());
  cachedService.shutdownNow();
  System.out.println("-----------------");

  // 產(chǎn)生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,
  // 若任務(wù)數(shù)量大于poolSize,任務(wù)會被放在一個queue里順序執(zhí)行
  ExecutorService fixedService = Executors.newFixedThreadPool(2);
  fixedService.submit(new MyThread());
  fixedService.submit(new MyThread());
  // 由于線程池大小為2,所以后面的任務(wù)必須等待前面的任務(wù)執(zhí)行完后才能被執(zhí)行。
  myThreadFuture = fixedService.submit(new MyThread());
  myCallableFuture = fixedService.submit(new MyCallable(myThreadFuture));
  System.out.println(myCallableFuture.get());
  fixedService.shutdownNow();
  System.out.println("-----------------");

  // 產(chǎn)生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,
  // 若任務(wù)數(shù)量大于poolSize,任務(wù)會在一個queue里等待執(zhí)行
  ScheduledExecutorService fixedScheduledService = Executors
    .newScheduledThreadPool(2);
  // 新建任務(wù)1
  MyThread task1 = new MyThread();
  // 使用任務(wù)執(zhí)行服務(wù)立即執(zhí)行任務(wù)1,而且此后每隔2秒執(zhí)行一次任務(wù)1。
  myThreadFuture = fixedScheduledService.scheduleAtFixedRate(task1, 0, 2,
    TimeUnit.SECONDS);
  // 新建任務(wù)2
  MyCallable task2 = new MyCallable(myThreadFuture);
  // 使用任務(wù)執(zhí)行服務(wù)等待5秒后執(zhí)行任務(wù)2,執(zhí)行它后會將任務(wù)1關(guān)閉。
  myCallableFuture = fixedScheduledService.schedule(task2, 5,
    TimeUnit.SECONDS);
  System.out.println(myCallableFuture.get());
  fixedScheduledService.shutdownNow();
 }
}

相關(guān)文章

  • mybatis實現(xiàn)特殊字段加密方式

    mybatis實現(xiàn)特殊字段加密方式

    這篇文章主要介紹了mybatis實現(xiàn)特殊字段加密,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Java多線程編程中的線程死鎖的問題解決

    Java多線程編程中的線程死鎖的問題解決

    線程死鎖是多線程編程中的一個常見問題,它發(fā)生在多個線程互相等待對方釋放資源的情況下,導(dǎo)致程序無法繼續(xù)執(zhí)行,本文就來介紹一下Java多線程編程中的線程死鎖的問題解決,感興趣的可以了解一下
    2023-08-08
  • Java動態(tài)調(diào)用類中方法代碼

    Java動態(tài)調(diào)用類中方法代碼

    這篇文章主要介紹了Java動態(tài)調(diào)用類中方法代碼,需要的朋友可以參考下
    2014-02-02
  • Jenkins安裝與配置及漢化過程

    Jenkins安裝與配置及漢化過程

    這篇文章主要介紹了Jenkins安裝與配置及漢化過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java實現(xiàn)電腦端掃描二維碼

    java實現(xiàn)電腦端掃描二維碼

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)電腦端掃描二維碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java 使用maven實現(xiàn)Jsoup簡單爬蟲案例詳解

    Java 使用maven實現(xiàn)Jsoup簡單爬蟲案例詳解

    這篇文章主要介紹了Java 使用maven實現(xiàn)Jsoup簡單爬蟲案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Springmvc模式上傳和下載與enctype對比

    Springmvc模式上傳和下載與enctype對比

    這篇文章主要介紹了Springmvc模式上傳和下載與enctype對比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • 實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊

    實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊

    這篇文章主要為大家介紹了實戰(zhàn)分布式醫(yī)療掛號系統(tǒng)之整合Swagger2到通用模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • java多線程返回值使用示例(callable與futuretask)

    java多線程返回值使用示例(callable與futuretask)

    這篇文章主要介紹了多線程返回值使用示例(callable與futuretask),需要的朋友可以參考下
    2014-04-04
  • Java ScheduledExecutorService的具體使用

    Java ScheduledExecutorService的具體使用

    ScheduledExecutorService有線程池的特性,也可以實現(xiàn)任務(wù)循環(huán)執(zhí)行,本文主要介紹了Java ScheduledExecutorService的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05

最新評論