• Callable 获取线程返回值


    allable Future 两功能是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();

        }

    }


  • 相关阅读:
    使用 ESP8266 制作 WiFi 干扰器
    苹果手机连接Wifi认证机制
    TK2 USB修复
    WiFi其他方法和WiFi事件响
    获取与esp8266连接的客户端的Mac地址 IP 端口 控制停止等问题
    WiFi其他方法和WiFi事件响应
    Arduino内部网页代理,网页穿透,公网访问Arduino内部网页
    ESP8266远程OTA升级
    分级基金及套利策略:申购套利、赎回套利、低折套利
    maven安装
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5039566.html
Copyright © 2020-2023  润新知