zoukankan      html  css  js  c++  java
  • Callable带返回值接口使用

    获取多线程的方式 
    1. 继承Thread 
    2. 实现Runnable接口 
    3. 实现Callable接口 带范型有返回值 FutureTask(Callable<V>) 
    4. 线程池

    Callable返回值获取放在最后(futureTask.get()) 
    调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask

    /**
     * Callable创建线程的方式(Callable带返回值)
     */
    class MyThreadByCallable implements Callable<Integer>{
    
        @Override
        public Integer call() throws Exception {
            System.out.println(Thread.currentThread().getName() + "	 来模拟计算");
    
            // 模拟计算业务
            TimeUnit.SECONDS.sleep(3);
    
            return 1024;
        }
    }
    /***
     * 三种创建线程方式
     * 1、继承Thread类
     * 2、实现Runnable接口
     * 3、使用Callable<String>接口,结合FutureTask
     * 今天就来演示Callable创建线程的方式(Callable带返回值)
     */
    public class CallableDemo {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            FutureTask<Integer> futureTask = new FutureTask<>(new MyThreadByCallable());
            // FutureTask<Integer> futureTask2 = new FutureTask<>(new MyThreadByCallable());
    
            Thread thread = new Thread(futureTask, "t1");
            thread.start();
            // 调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask
            // Thread thread2 = new Thread(futureTask2, "t2");
            // thread2.start();
    
            // Callable返回值获取如果放在这里,它会阻塞main线程计算,会影响并发效率
            // Integer t1Result = futureTask.get();
    
            // main线程模拟计算
            Integer mainResult = 1000;
            System.out.println("main线程计算完毕,mainResult=" + mainResult);
    
            /*while(!futureTask.isDone()){
    
            }*/
    
            // Callable返回值获取最好放在最后,否则如果t1计算时间过长,它会阻塞main线程计算
            Integer t1Result = futureTask.get();
    
            System.out.println("t1线程计算完毕,t1Result=" + t1Result);
            System.out.println("两个线程计算总和为:" + (mainResult + t1Result));
    
    
            System.out.println(Runtime.getRuntime().availableProcessors());
    
        }
    }
    

     

  • 相关阅读:
    Oracle连接数一直在增
    ora00020: maximum number of processes (150) exeeded
    oracle归档日志满了
    C# ZPL
    error CS0227: 不安全代码只会在使用 /unsafe 编译的情况下出现
    最全zpl语言指令解析(含乱码)
    ZPL 打印机实例
    ora-01400 无法将NULL插入 ID 解决方法
    windows 选择时间控件(选择日期, 小时分钟秒)
    用户登陆检验----没有优化,大神可以帮忙优化优化
  • 原文地址:https://www.cnblogs.com/xhyouyou/p/12465330.html
Copyright © 2011-2022 走看看