zoukankan      html  css  js  c++  java
  • 带有返回值的线程(JDK1.8新特性)

    7.3 实现线程的第三种方式:FutureTask方式,实现Callable接口。(JDK8新特性。)
            这种方式实现的线程可以获取线程的返回值。
            之前讲解的那两种方式是无法获取线程返回值的,因为run方法返回void。
            
            思考:
                系统委派一个线程去执行一个任务,该线程执行完任务之后,可能会有一个执行结果,我们怎么拿到这个执行结果呢?
                    使用第三种方式:实现Callable接口方式。
     
    案例:
    package com.javaSe.Thread;
    
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;// JUC包下的,数据java并发包,老JDK中没有这个包,新特性。
    
    
    /*
    实现线程的第三种方式:
        实现Callable接口。
        这种方式的优点:可以获取到线程的执行结果。
        这种方式的缺点:效率较低,在获取t线程执行结果的时候,当线程受阻,效率较低。
    */
    public class ThreadTest15 {
        public static void main(String[] args) {
            // 第一步:创建一个“未来任务类”对象
            // 参数非常重要,需要给一个Callable接口实现类对象。
            FutureTask task = new FutureTask(new Callable() {
                @Override
                public Object call() throws Exception {// call()方法就相当于run方法,只不过这个有返回值
                    // 线程执行一个任务,执行之后可能会有一个执行结果
                    // 模拟执行
                    System.out.println("call method begin");
                    Thread.sleep(1000 * 10);
                    System.out.println("call method end");
                    int a = 100;
                    int b = 200;
                    return a + b; // 自动装箱(300结果变成Integer)
                }
            });
            
            // 创建一个线程对象
            Thread t = new Thread(task);
            
            // 启动线程
            t.start();
            
            // 在这里是main方法,这是在主线程中。
            // 在主线程中,怎么获取t线程的结果。
            // 怎么获取t线程返回的结果
            try {
                // get方法的执行会导致“当前线程阻塞”
                Object msg = task.get();
                System.out.println("线程执行结果" + msg);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            
            // main方法这里的程序要想执行必须等待get()方法结束
            // 而get()方法可能需要很久。因为get()方法是为了拿另一个线程的执行结果
            // 另一个线程执行是需要时间的。
            System.out.println("hello world!");
        }
    }
  • 相关阅读:
    centos7安装puppet详细教程(简单易懂,小白也可以看懂的教程)
    centos7.3下安装nginx
    JS实现转动随机数抽奖的特效代码
    【孤独旅者】封装一个三级联动和基于Vue的mintUI三级联动
    【孤独旅者】Vue-封装$on,$emit,$off
    数据可视化,选择Echarts还是Highcharts?
    关于redux和react-redux
    vue 封装一个插件
    vue实现点击回到顶部
    vue实现吸顶
  • 原文地址:https://www.cnblogs.com/xlwu/p/13576864.html
Copyright © 2011-2022 走看看