Java之Callable和Runnable

1 接口定义

1) Callable接口

public interface Callable<V> {
    V call() throws Exception;
}

2) Runnable接口

public interface Runnable {
    public abstract void run();
}

2 不同点和相同点

1)相同点

都是接口,都可编写多线程程序,都是调用Thread.start()启动线程

2)不同点

Callable可以返回执行结果,是个泛型,与Future、FutureTask配合可以通过FutureTask.get()获取异步执行的结果,但是Runnable不可以。

Callable里面有取消这个任务,而且异常可以外抛,但是Runnable异常只能内部run消化。

FutureTask.get()得到异步执行的结果,此方法会阻塞主进程的继续往下执行。

3 Callable测试用例

import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class TestCallableAndFuture {
    public static void main(String[] args) {

        //构建Callable
        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                Thread.sleep(2000);
                return "chenyu callable finish";
            }
        };

        //构建FutureTask
        FutureTask<String> futureTask = new FutureTask<>(callable);

        //运行线程
        new Thread(futureTask).start();

        try {
            System.out.println("chenyu begin");
            System.out.println(futureTask.isDone());
            //futureTask.cancel(true);
            if (!futureTask.isCancelled()) {
                System.out.println(futureTask.get());
                System.out.println(futureTask.isDone());
                System.out.println("chenyu end");
            } else {
                System.out.println("the thread is cancel");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

4 运行结果

如果注释掉// futureTask.cancel(true)运行结果如下

chenyu begin
false
chenyu callable finish
true
chenyu end

如果不注释掉futureTask.cancel(true)运行结果如下

chenyu begin
false
the thread is cancel
(0)

相关推荐

  • 【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

    【JAVA并发第二篇】Java线程的创建与运行,线程状态与常用方法

  • Java并发编程之线程的创建

    简介 线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在.一个进程至少有一个线程,进程中的多个线程共享进程的资源. Java中创建线程的方式有多种如继承Thread ...

  • java学习——110.实现Runnable接口

    因为Java只支持单继承,如果已经继承了一个类,就不能再继承Thread类了,此时,要实现多继承,可以实现Runnable接口. 1.Runnable接口 Runnable接口就是为实现多线程的,它里 ...

  • JAVA多线程学习笔记整理

    多线程: 三种创建方法 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程. (匿名内部类) (Lambda表达式) 实现Runable接口,以线程运行 ...

  • 为什么要选择学习Java?适合零基础的初学者的文章

    我经常收到这样的问题:"要学习的第一门编程语言是什么?" Java是一门好的编程语言吗?"和" Java是适合初学者的好的第一门编程语言,还是我应该从Java或 ...

  • Java高并发21-AQS在共享,独占场景下的源码介绍

    一.AQS--锁的底层支持 1.AQS是什么 AQS是AbstractQueuedSychronizer的简称,即抽象同步队列的简称,这是实现同步器的重要组件,是一个抽象类,虽然在实际工作中很烧用到它 ...

  • Java基础之:泛型

    Java基础之:泛型 在不使用泛型的情况下,在ArrayList 中,添加3个Dog. Dog对象含有name 和 age, 并输出name 和 age (要求使用getXxx()). package ...

  • 2021最新 Java虚拟机(JVM)面试题精选(附刷题小程序)

    推荐使用小程序阅读 为了能让您更加方便的阅读 本文所有的面试题目均已整理至小程序<面试手册> 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验! 目录 推荐使用小程序阅读 1. J ...

  • 成为一名优秀的Java程序员9+难以置信的公式

    成为一名优秀的Java程序员 成为一名优秀的Java程序员并不重要,但是首先您应该了解基本的编程语言. 好吧,你知道那太好了.我们应该一步一步地精通Java编程,并应遵循所有说明,改进Java的编程逻 ...

  • Java异常处理(观察常见异常)

    一:观察异常 在一上一节我们讲解了常见的异常类型,这次可我们通过代码来观察这些异常是如何出现的. DEMO:算术异常   此时出现的是算术异常. DEMO:数组越界异常   发现了出现异常的之后的代码 ...

  • Azure上的Java:云原生身份验证

    API通常需要识别其调用方.它可以是调用API的Web应用程序,也可以是调用API的另一个API.识别API的调用者也称为身份验证.建立自己的身份验证框架可能很棘手.值得庆幸的是,不必建立自己的身份验 ...