Runnable,Callable,Future,RunnableFuture,FutureTask,ExecutorService的关系

本文主要是介绍Runnable,Callable,Future,RunnableFuture,FutureTask,ExecutorService的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关系

Executor就是Runnable和Callable的调度容器,Future就是对于具体的调度任务的执行结果进行查看,最为关键的是Future可以检查对应的任务是否已经完成,也可以阻塞在get方法上一直等待任务返回结果。Runnable和Callable的差别就是Runnable是没有结果可以返回的,就算是通过Future也看不到任务调度的结果的。 

FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口,另外它还可以包装Runnable和Callable<V>,所以一般来讲是一个符合体了,它可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行,并且还可以通过v get()返回执行结果,在线程体没有执行完成的时候,主线程一直阻塞等待,执行完则直接返回结果。

开启线程的几种方法:

1.通过继承Thread类开启线程

  /*** 通过继承Thread类开启线程*/private void extendsThread() {new MyThread().start();}class MyThread extends Thread{@Overridepublic void run() {super.run();System.out.println("通过继承Thread类开启线程");}}

2.Runnable+Thread

  /*** 通过new Thread(runnable)开启线程*/private void runnableThread() {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("通过new Thread(runnable)开启线程");}}).start();}

3.Callable+FutureTask+Thread

    /*** 通过new Thread(new FutureTask(callable))开启线程*/private void callableFutureTaskThread() {FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("通过new Thread(new FutureTask(callable))开启线程");return "finish 通过new Thread(new FutureTask(callable))开启线程";}});new Thread(futureTask).start();try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

4.ExecutorService+Callable+Future

 /*** 通过 executorService.submit(callable)并且return一个Future开启线程*/private void executorServiceCallableFuture() {ExecutorService executorService = Executors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池;Future<String> future = executorService.submit(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("通过 executorService.submit(callable)并且return一个Future开启线程");return "finish 通过 executorService.submit(callable)并且return一个Future开启线程";}});try {System.out.println(future.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

5.ExecutorService+Runnable+Future

 /*** 通过 executorService.submit(runnable,T)并且return一个Future开启线程*/private void executorServiceRunnableFuture() {ExecutorService executorService = Executors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池;Future<String> future = executorService.submit(new Runnable() {@Overridepublic void run() {System.out.println("通过 executorService.submit(runnable,T)并且return一个Future开启线程");}},"finish 通过 executorService.submit(runnable,T)并且return一个Future开启线程");try {System.out.println(future.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}

6.ExecutorService+FutureTask

 /*** 通过 executorService.submit(futureTask)开启线程*/private void executorServiceFutureTask() {ExecutorService executorService = Executors.newFixedThreadPool(5);//创建一个可重用固定线程数的线程池;FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {@Overridepublic String call() throws Exception {System.out.println("通过 executorService.submit(futureTask)开启线程");return "通过 executorService.submit(futureTask)开启线程";}});executorService.submit(futureTask);try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}



这篇关于Runnable,Callable,Future,RunnableFuture,FutureTask,ExecutorService的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980931

相关文章

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

Callable 和Future

在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。 现在Java终于有可返回值的任务(也可以叫做线程)了。  可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callabl

Callable及Future

1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各种特性 ExecutorService executor

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

Mysql数据库约束的概述 , 逐渐约束 , 主键自增 , 表关系的概念和外键 ,多表关系约束介绍和使用

约束和表设计 1、DQL查询语句-limit语句(掌握) 目标 能够掌握limit语句的使用 讲解 作用: LIMIT是限制的意思,所以LIMIT`的作用就是限制查询记录的条数。 LIMIT语句格式: select * from 表名 limit offset, row_count;mysql中limit的用法:返回前几条或者中间某几行数据-- 1 表示分页查询的索引,对应数

抽象类和接口之间的关系

1。类可以实现多个接口而只能继承一个超类。 2。抽象类可以有非抽象方法而接口的方法只能都是抽象的。 3。抽象类可以定义和使用变量而接口则不可以。 4。抽象类中的方法可以有各种不同的修饰符,而接口中的方法默认都是public,不允许字面定修饰符。 一个接口中的成员函数可以在不同的类中安装,而它的成员函数可以有很多种的实现方法,但是抽象类却不能象这样,它必须是由子类来继承,然后由子类来实现它的

材质、纹理、贴图的关系

材质、纹理、贴图的关系 材质 (Material)包含贴图 (Map),贴图包含纹理 (Texture)。 纹理(Texture)是最基本的数据输入单位。

机器学习基础:与Python关系和未来发展

目录 初识Python Python的由来 自由软件运动 编译方式的演进 Python语言的特点 语法简单,易于理解 语法结构清晰,快速上手 丰富的第三方库 机器学习 监督学习 无监督学习 半监督学习         欢迎回到我们的神经网络与深度学习Tensorflow实战学习,本篇为人工智能学习第三篇文章。前面的文章中我们学习安装了Tensorflow-GPU,在本

Maven和JAVA_HOME的关系

在Java开发中,Maven和JAVA_HOME是两个关键的概念,它们在构建和运行Java应用程序时具有不同的角色,但却相互关联。以下是它们的关系和各自的作用: JAVA_HOME 定义和作用: JAVA_HOME是一个环境变量,它指向JDK(Java Development Kit)的安装目录。系统通过JAVA_HOME知道在哪里找到Java编译器(javac)、Java虚拟机(java)