国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java自定義任務(wù)類定時執(zhí)行任務(wù)示例 callable和future接口使用方法

2019-11-26 15:46:13
字體:
供稿:網(wǎng)友

Callable 和 Future接口

Callable是類似于Runnable的接口,實(shí)現(xiàn)Callable接口的類和實(shí)現(xiàn)Runnable的類都是可被其它線程執(zhí)行的任務(wù)。

Callable和Runnable有幾點(diǎn)不同:
(1)Callable規(guī)定的方法是call(),而Runnable規(guī)定的方法是run().
(2)Callable的任務(wù)執(zhí)行后可返回值,而Runnable的任務(wù)是不能返回值的。
(3)call()方法可拋出異常,而run()方法是不能拋出異常的。
(4)運(yùn)行Callable任務(wù)可拿到一個Future對象, Future表示異步計算的結(jié)果。

它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結(jié)果。
通過Future對象可了解任務(wù)執(zhí)行情況,可取消任務(wù)的執(zhí)行,還可獲取任務(wù)執(zhí)行的結(jié)果。


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

package com.yao;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFuture {

 /**
  * 自定義一個任務(wù)類,實(shí)現(xiàn)Callable接口
  */
 public static class MyCallableClass implements Callable {
  // 標(biāo)志位
  private int flag = 0;

  public MyCallableClass(int flag) {
   this.flag = flag;
  }

  public String call() throws Exception {
   if (this.flag == 0) {
    // 如果flag的值為0,則立即返回
    return "flag = 0";
   }
   if (this.flag == 1) {
    // 如果flag的值為1,做一個無限循環(huán)
    try {
     while (true) {
      System.out.println("looping......");
      Thread.sleep(2000);
     }
    } catch (InterruptedException e) {
     System.out.println("Interrupted");
    }
    return "false";
   } else {
    // falg不為0或者1,則拋出異常
    throw new Exception("Bad flag value!");
   }
  }
 }

 public static void main(String[] args) {
  // 定義3個Callable類型的任務(wù)
  MyCallableClass task1 = new MyCallableClass(0);
  MyCallableClass task2 = new MyCallableClass(1);
  MyCallableClass task3 = new MyCallableClass(2);

  // 創(chuàng)建一個執(zhí)行任務(wù)的服務(wù)
  ExecutorService es = Executors.newFixedThreadPool(3);
  try {
   // 提交并執(zhí)行任務(wù),任務(wù)啟動時返回了一個Future對象,
   // 如果想得到任務(wù)執(zhí)行的結(jié)果或者是異常可對這個Future對象進(jìn)行操作
   Future future1 = es.submit(task1);
   // 獲得第一個任務(wù)的結(jié)果,如果調(diào)用get方法,當(dāng)前線程會等待任務(wù)執(zhí)行完畢后才往下執(zhí)行
   System.out.println("task1: " + future1.get());

   Future future2 = es.submit(task2);
   // 等待5秒后,再停止第二個任務(wù)。因?yàn)榈诙€任務(wù)進(jìn)行的是無限循環(huán)
   Thread.sleep(5000);
   System.out.println("task2 cancel: " + future2.cancel(true));

   // 獲取第三個任務(wù)的輸出,因?yàn)閳?zhí)行第三個任務(wù)會引起異常
   // 所以下面的語句將引起異常的拋出
   Future future3 = es.submit(task3);
   System.out.println("task3: " + future3.get());
  } catch (Exception e) {
   System.out.println(e.toString());
  }
  // 停止任務(wù)執(zhí)行服務(wù)
  es.shutdownNow();
 }
}

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 历史| 策勒县| 屏山县| 鸡东县| 洪洞县| 宜黄县| 获嘉县| 沛县| 高要市| 宁晋县| 湖口县| 甘洛县| 南涧| 镇江市| 青州市| 淮阳县| 隆尧县| 赤水市| 岳阳市| 淮南市| 锡林郭勒盟| 阿坝| 长宁县| 定襄县| 武鸣县| 娱乐| 沽源县| 清丰县| 涪陵区| 兴城市| 濮阳市| 邵阳县| 安庆市| 广州市| 龙里县| 衡阳市| 威海市| 香港 | 苏尼特右旗| 临洮县| 四川省|