Java多线程之Callable接口的完成 (转)ITeye - 凯时娱乐

Java多线程之Callable接口的完成 (转)ITeye

2019年02月23日10时17分18秒 | 作者: 尔槐 | 标签: 线程,办法,成果 | 浏览: 1370

本文转自
http://aloys.iteye.com/blog/630135



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 { 
 /** *//** 
 * 自界说一个使命类,完结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 quot;flag = 0 quot;; 
 if (this.flag  1){ 
 // 假如flag的值为1,做一个无限循环 
 try { 
 while (true) { 
 System.out.println( quot;looping. quot;); 
 Thread.sleep(2000); 
 } catch (InterruptedException e) { 
 System.out.println( quot;Interrupted quot;); 
 return quot;false quot;; 
 } else { 
 // falg不为0或许1,则抛出反常 
 throw new Exception( quot;Bad flag value! quot;); 
 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( quot;task1: quot; + future1.get()); 
 Future future2 = es.submit(task2); 
 // 等候5秒后,再中止第二个使命。由于第二个使命进行的是无限循环 
 Thread.sleep(5000); 
 System.out.println( quot;task2 cancel: quot; + future2.cancel(true)); 
 // 获取第三个使命的输出,由于履行第三个使命会引起反常 
 // 所以下面的句子将引起反常的抛出 
 Future future3 = es.submit(task3); 
 System.out.println( quot;task3: quot; + future3.get()); 
 } catch (Exception e){ 
 System.out.println(e.toString()); 
 // 中止使命履行效劳 
 es.shutdownNow(); 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章