zoukankan      html  css  js  c++  java
  • JUC-Callable

    实现线程的方式有四种:

    1,实现runnable接口:

    2,继承Thread。

    3,也就是本节的Callable接口。

    4,使用线程池。

    区别:

    实现Callable接口的方式,相较于实现Runnable接口方式,可以有返回值,并且可以抛出异常。

    执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类

    FutureTask 可用于闭锁,FutureTask.get()方法用于获取线程结果,在线程里面的call方法没有执行完,获取到结果之前,FutureTask.get()之后的代码不会执行

    效果类似于countDownLatch,countDownLatch在所有运行结束之前,latch.await()之后代码不会执行。

    步骤:

    1,新建一个线程类实现Callable接口,Callable接口里面有泛型,用来定义返回结果类型,重写call方法

    call方法的返回类型即使泛型的结果类型:

    并且call方法能抛出异常:

    class ThreadDemo implements Callable<Integer>{
    
        @Override
        public Integer call() throws Exception {

    2,实例化线程类:

    ThreadDemo td = new ThreadDemo();

    3,使用FutureTask类,参数就是线程类对象。

            //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
            FutureTask<Integer> result = new FutureTask<>(td);

    4,把FutureTask对象作为Thread类参数,启动线程:

    new Thread(result).start();

    5,通过FutureTask对象,获取线程执行结果:

    Integer sum = result.get();  //FutureTask 可用于 闭锁

    实例:

    package com.atguigu.juc;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    /*
     * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。
     * 
     * 二、执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。  FutureTask 是  Future 接口的实现类
     */
    public class TestCallable {
        
        public static void main(String[] args) {
            ThreadDemo td = new ThreadDemo();
            //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
            FutureTask<Integer> result = new FutureTask<>(td);
            new Thread(result).start();
            
            //2.接收线程运算后的结果
            try {
                Integer sum = result.get();  //FutureTask 可用于 闭锁
                System.out.println(sum);
                System.out.println("------------------------------------");
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
    
    class ThreadDemo implements Callable<Integer>{
    
        @Override
        public Integer call() throws Exception {
            int sum = 0;
            for (int i = 0; i <= 1000; i++) {
                sum += i;
            }
            return sum;
        }
        
    }
  • 相关阅读:
    Android(一)
    git
    UBuntu18.04 配置环境
    TensorRT Development document (Python)
    继续
    tensorRT C++ API
    tensorRT 与yolov3_tiny
    浅谈PHP进程管理
    nginx 平滑重启的实现方法
    fast-cgi & php-fpm 等的理解 (讨论试理解)
  • 原文地址:https://www.cnblogs.com/alsf/p/9131473.html
Copyright © 2011-2022 走看看