日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Callable与Future的介绍

發布時間:2023/12/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Callable与Future的介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Callable與Future的介紹

? ? CallableFuture?兩功能是Java在后續版本中為了適應多并法才加入的,Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其他線程執行的任務。

Callable的接口定義如下;

public interface Callable<V> {?

? ? ? V ? call() ? throws Exception;?

}?

Callable和Runnable的區別如下:

I ?? Callable定義的方法是call,而Runnable定義的方法是run。

II ? Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。

III ?Callable的call方法可拋出異常,而Runnable的run方法不能拋出異常。 ?

Future 介紹

Future表示異步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。Future的cancel方法可以取消任務的執行,它有一布爾參數,參數為 true 表示立即中斷任務的執行,參數為 false 表示允許正在運行的任務運行完成。Future的 get 方法等待計算完成,獲取計算結果

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

/**

?* Callable 和 Future接口

?* Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。

?* Callable和Runnable有幾點不同:

?* (1)Callable規定的方法是call(),而Runnable規定的方法是run().

?* (2)Callable的任務執行后可返回值,而Runnable的任務是不能返回值的。

?* (3)call()方法可拋出異常,而run()方法是不能拋出異常的。

?* (4)運行Callable任務可拿到一個Future對象,

?* Future 表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。

?* 通過Future對象可了解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。

?*/

public class CallableAndFuture {

? ? public static class? MyCallable ?implements Callable{

? ? ? ? ? private int flag = 0;?

? ? ? ? ? public MyCallable(int flag){

? ? ? ? ? ? ? ? ? this.flag = flag;

? ? ? ? ? }

? ? ? ? ??public String call() throws Exception{

? ? ? ? ? ? ??if (this.flag == 0){ ?

? ? ? ? ? ? ? ? ? ? ? return "flag = 0";

? ? ? ? ? ? }?

? ? ? ? ? ? if (this.flag == 1){ ??

? ? ? ? ? ? ? ? try {

? ? ? ? ? ? ? ? ? ? while (true) {

? ? ? ? ? ? ? ? ? ? ? ? ? ??System.out.println("looping.");

? ? ? ? ? ? ? ? ? ? ? ? ? ? Thread.sleep(2000);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? } catch (InterruptedException e) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("Interrupted");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return "false";

? ? ? ? ? ? } else { ??

? ? ? ? ? ? ? ? ? ? ? ?throw new Exception("Bad flag value!");

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? public static void main(String[] args) {

? ? ? ?// 定義3個Callable類型的任務

? ? ? ? MyCallable task1 = new MyCallable(0);

? ? ? ? MyCallable task2 = new MyCallable(1);

? ? ? ? MyCallable task3 = new MyCallable(2);

? ? ? ??

? ? ? ?// 創建一個執行任務的服務

? ? ? ? ExecutorService es = Executors.newFixedThreadPool(3);

? ? ? ? try {

? ? ? ? ?? // 提交并執行任務,任務啟動時返回了一個Future對象,

? ? ? ? ? ? // 如果想得到任務執行的結果或者是異常可對這個Future對象進行操作

? ? ? ? ? ? Future future1 = es.submit(task1);

? ? ? ? ?? // 獲得第一個任務的結果,如果調用get方法,當前線程會等待任務執行完畢后才往下執行

? ? ? ? ? ? System.out.println("task1: " + future1.get());

? ? ? ? ? ??

? ? ? ? ? ? Future future2 = es.submit(task2);

? ? ? ? ?? // 等待5秒后,再停止第二個任務。因為第二個任務進行的是無限循環

? ? ? ? ? ? Thread.sleep(5000);

? ? ? ? ? ? System.out.println("task2 cancel: " + future2.cancel(true));

? ? ? ? ? ??

? ? ? ? ?? // 獲取第三個任務的輸出,因為執行第三個任務會引起異常

? ? ? ? ? ? // 所以下面的語句將引起異常的拋出

? ? ? ? ? ? Future future3 = es.submit(task3);

? ? ? ? ? ? System.out.println("task3: " + future3.get());

? ? ? ? } catch (Exception e){

? ? ? ? ? ? System.out.println(e.toString());

? ? ? ? }

? ? ? ?// 停止任務執行服務

? ? ? ? es.shutdownNow();

? ? }

}

轉載于:https://www.cnblogs.com/whgw/archive/2011/09/28/2194760.html

總結

以上是生活随笔為你收集整理的Callable与Future的介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。