zoukankan      html  css  js  c++  java
  • Callable 接口的使用

    Callable 接口的使用

    Callable 接口是 Java 中实现线程的另一种方式,它和 Runnable 明显的区别有两点

    1. Rannable 实现的线程不能抛异常,Callable 可以
    2. Runnable 接口实现的线程不能返回值,Callable 可以

    使用 Callable 接口例子

    1. 创建一个实现 callable 接口的类,重写 call 方法
    2. 创建一个FutureTask 对象接收创建的接口类
    3. 创建 Thread 类,放入 FutureTask 类,然后调用Start 方法,这样就会调用call 方法
    4. 使用 FutureTask 对象的get 方法获取 call 的返回值

    如下

    创建一个实现类 Callable 接口的类,重写 call 方法

    /**
     * 一个实现类 callable 接口的类
     * 重写 call 方法作为多线程的方法
     */
    class MyThread implements Callable<Integer> {
    
        @Override
        public Integer call() throws Exception {
            System.out.println("hello you call call method");
            TimeUnit.SECONDS.sleep(2);
            return 123;
        }
    }
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    import java.util.concurrent.TimeUnit;
    
    public class CallableTest {
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            MyThread myThread = new MyThread();
            // 创建一个FutureTask 对象接收创建的接口类
            FutureTask futureTask = new FutureTask(myThread);
            // 创建 Thread 类,放入 FutureTask 类,然后调用Start 方法,这样就会调用call 方法
            new Thread(futureTask, "A").start();
            // 使用 FutureTask 对象的 get 方法获取 call 的返回值
            Integer integerResult = (Integer) futureTask.get();
            System.out.println(integerResult);
        }
    }
    

    使用Callable 会出现的问题

    1. 返回的结果可能需要等待,不是立即返回
    2. 有缓冲,有同样的请求返回的结果和上次一样的话会不在调用,直接返回上一次的结果
    public static void main(String[] args) throws ExecutionException, InterruptedException {
            MyThread myThread = new MyThread();
            FutureTask futureTask = new FutureTask(myThread);
            new Thread(futureTask, "A").start();
            new Thread(futureTask, "B").start();
            Integer integerResult = (Integer) futureTask.get();
            System.out.println(integerResult);
        }
    控制台只打出下面信息一遍
    hello you call call method
    123
    
    坚持做好每件事,然后再做下一件。
  • 相关阅读:
    【实践】mysql数据库表设计及存储过程设计
    # Java类链接模型
    java gc
    Spring Data Jpa
    Spring Security
    Amazon SQS 消息队列服务
    JMS概述
    jdk 7&8 new features
    java jri null
    java.lang.OutOfMemoryError: PermGen space
  • 原文地址:https://www.cnblogs.com/vawa/p/14459084.html
Copyright © 2011-2022 走看看