首页 > 其他分享 >创建线程方法三:使用Callable和Future创建线程

创建线程方法三:使用Callable和Future创建线程

时间:2023-02-26 16:24:33浏览次数:55  
标签:变量 创建 Callable 线程 返回值 FutureTask call

一:
从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。

call()方法可以有返回值。

call()方法可以声明抛出异常。

创建并启动线程的步骤如下:

1 创建Callable接口的实现类,并实现call()方法,该call()方法将作为该线程的执行体,且该call()方法有返回值,再创建Callable的实例。从Java 8开始,可以直接使用Lamda表达式创建Callable对象。

2 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

3 使用FutureTask对象作为Thread对象的target创建并启动新线程。

4 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。

二:代码

package Thread;

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

/**
 * 第三种新建线程的方式:使用Callable和Future创建线程
 */
public class ThirdThread {
    public static void main(String[] args) {
        // 创建Callable对象
        // 先使用Lambda表达式创建Callable<Integer>对象
        // 使用FutureTask来包装Callable对象
        FutureTask<Integer> task = new  FutureTask<Integer>((Callable<Integer>)() -> {
            int i = 0;
            for ( ; i < 100 ; i++ )
            {
        System.out.println(Thread.currentThread().getName()
                        + " 的循环变量i的值:" + i);
            }
            // call()方法可以有返回值
            return i;
        });
        for (int i = 0 ; i < 100 ; i++)
        {
            System.out.println(Thread.currentThread().getName()
                    + " 的循环变量i的值:" + i);
            if (i == 20)
            {
                // 实质还是以Callable对象来创建、并启动线程
                new Thread(task , "有返回值的线程").start();
            }
        }
        try
        {
            // 获取线程返回值
            System.out.println("子线程的返回值:" +  task.get());
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}

三:运行

main 的循环变量i的值:98
main 的循环变量i的值:99
有返回值的线程 的循环变量i的值:23
有返回值的线程 的循环变量i的值:24
有返回值的线程 的循环变量i的值:25
......
有返回值的线程 的循环变量i的值:94
有返回值的线程 的循环变量i的值:95
有返回值的线程 的循环变量i的值:96
有返回值的线程 的循环变量i的值:97
有返回值的线程 的循环变量i的值:98
有返回值的线程 的循环变量i的值:99
子线程的返回值:100

四:代码说明
程序先使用使用Lamda表达式创建一个Callable对象,然后将该实例包装成一个FutureTask对象。主线程中当循环变量i等于20时,程序启动以FutrueTask对象为target的线程。程序最后调用FutrueTask对象的get()方法来返回call()方法的返回值——该方法将导致主线程被阻塞,直到call()方法结束并返回为止。

原文链接:https://blog.csdn.net/chengqiuming/article/details/90572779

标签:变量,创建,Callable,线程,返回值,FutureTask,call
From: https://www.cnblogs.com/techgy/p/17156884.html

相关文章

  • 使用骨架创建maven的java工程 不使用骨架创建maven的java工程
    使用骨架创建maven的java工程         不使用骨架创建maven工程新建项目       ......
  • 使用骨架创建maven的java工程与不使用骨架创建maven的java工程
    使用骨架创建maven的java工程           不使用骨架创建maven的java工程          翻译搜索复制......
  • JAVA多线程(三)--线程生命周期
    一、线程的状态在Java中,线程在创建并启动后,不是一开始就进入执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(NEW)、就绪(RUNNABLE)、阻塞(BLOCKED)、等待(WAIT......
  • 912~913技术选型,创建数据库
    技术选型1、Web层1)Servlet:前端控制器2)html:视图3)Filter:过滤器4)BeanUtils:数据封装5)Jackson:json序列化工具2、Servite层6)Javamail:java......
  • maven项目中创建servlet类
    maven项目中创建servlet类【以下步骤都是在设置好maven(maven的环境变量配置和本地仓库的配置)和Tomcat后,进行以下步骤】创建web应用(用的是idea2022版本),按照图示进行创建,......
  • 创建 初始化
    packageobject;publicclassobjectcj{//类是抽象的,对象是具体的publicstaticvoidmain(String[]args){System.out.println();}}......
  • 线程互斥实现方式
    1.互斥锁2.读写硕3.线程信号量 互斥锁:互斥锁的数据类型:pthread_mutex_t互斥锁是一种加锁的方法来控制对共享资源的访问。同一时刻只能由一个线程掌握某......
  • 线程的互斥和同步
    互斥:相互排斥,表示线程对共享资源的访问时相互排斥的,即不能同时操作(一个线程对共享资源写时,另外一个线程不能再对这个共享资源进行读写),保证线程的安全,互斥不能保证......
  • 父进程对子进程不进行回收,让系统去回收,线程也一样
    在父进程中,使用下面函数以后,父进程对子进程不进行回收,让操作系统去回收signal(SIGCHLD,SIG_IGN);如果主线程对子线程,不进行回收的时候,采用子线程和主线程分离,分离以......
  • SpringBoot项目创建
    1.通过SpringInitializr创建访问网址:https://start.spring.io/界面介绍Project:初始化SpringBoot类型SpringBoot:选择SpringBoot版本ProjectMetadata:项目的......