java自界說義務類准時履行義務示例 callable和future接口應用辦法。本站提示廣大學習愛好者:(java自界說義務類准時履行義務示例 callable和future接口應用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是java自界說義務類准時履行義務示例 callable和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對象可懂得義務履行情形,可撤消義務的履行,還可獲得義務履行的成果。
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 {
/**
* 自界說一個義務類,完成Callable接口
*/
public static class MyCallableClass implements Callable {
// 標記位
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,做一個無窮輪回
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類型的義務
MyCallableClass task1 = new MyCallableClass(0);
MyCallableClass task2 = new MyCallableClass(1);
MyCallableClass task3 = new MyCallableClass(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();
}
}