首页 > 编程语言 >JUC并发编程学习笔记(六)Callable(简单)

JUC并发编程学习笔记(六)Callable(简单)

时间:2023-11-03 19:33:33浏览次数:40  
标签:JUC Runnable callable Thread 编程 Callable FutureTask new

Callable(简单)

callable接口和runnable接口类似,都是为了执行另外一条线程而设计的,区别是Runnable不会返回结果也不会抛出异常。

1、可以有返回值

2、可以抛出异常

3、方法不同;run()/call();

Runnable

实现Runnable接口,重写run方法,无返回值

//原线程
class RunnableThread implements Runnable{
    @Override
    public void run() {

    }
}

Callable

实现Callable接口,重写call方法,有返回值,可在实现接口时设定

//callable线程
class CallableThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        return null;
    }
}

Callable中泛型的参数等于方法的返回类型

启动callable

Thread类中没有填入callable接口的重载方法,所以我们需要通过适配类完成操作

通过查找Runnable接口的实现类,能够发现有一个FutureTask中提供了Callable参数的构造方法

所以,可以通过FutureTask来作为一个中间人的角色使用线程运行callable的实现类。

具体代码

package org.example.callable;

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

public class CallableTest {
    public static void main(String[] args) {
//        new Thread(()->{new Runnable()}).start();
//        new Thread(()->{new FutureTask<V>()}).start();
//        new Thread(()->{new FutureTask<V>( Callable )}).start();
        CallableThread thread = new CallableThread();//怎样启动Callable

        FutureTask task = new FutureTask(thread);//适配类
        new Thread(task,"A").start();//正常打印两个call,但是这边只会打印一个,结果会被缓存,提高效率
        new Thread(task,"B").start();
        try {
            String  o = (String) task.get();//get方法可能产生阻塞,耗时操作时;通过异步操作或者将它放在最后使用
            System.out.println(o);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            throw new RuntimeException(e);
        }

    }
}

//callable线程
class CallableThread implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("call");
        return "cals";
    }
}

细节

1、为了提高效率所以有缓存

2、耗时操作时,获取callable的返回值可能会产生对该方法调用实例的线程阻塞

标签:JUC,Runnable,callable,Thread,编程,Callable,FutureTask,new
From: https://www.cnblogs.com/nhgtx/p/17805985.html

相关文章

  • 突破性的多语言代码大模型基CodeShell:引领AI编程新时代
    突破性的多语言代码大模型基CodeShell:北京大学与四川天府银行联合打造,引领AI编程新时代1.CodeShell简介CodeShell是北京大学知识计算实验室联合四川天府银行AI团队研发的多语言代码大模型基座。它拥有70亿参数,经过对五千亿Tokens的训练,并具有8192的上下文窗口长度。CodeShell在......
  • 突破性的多语言代码大模型基CodeShell:引领AI编程新时代
    突破性的多语言代码大模型基CodeShell:北京大学与四川天府银行联合打造,引领AI编程新时代1.CodeShell简介CodeShell是北京大学知识计算实验室联合四川天府银行AI团队研发的多语言代码大模型基座。它拥有70亿参数,经过对五千亿Tokens的训练,并具有8192的上下文窗口长度。CodeShell在......
  • 实验3—C语言函数应用编程
    1、实验任务1源代码1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN806voidprint_text(intline,intcol,chartext[]);//函数声明7voidprint_spaces(intn);//函数声明8voidprint_b......
  • 编程猫11岁学员拿到NOC决赛一等奖,妈妈分享教育心得
    来自广州的龙芷盈今年11岁,上五年级。她在编程猫学习编程快三年的时间,已经拿到了蓝桥杯国赛二等奖、NOC决赛一等奖。小盈妈妈说“小盈平常有点难管教、很倔强”,但同时也是个有主见、有规划的孩子,她会自己做好学习规划和时间管理,这也让她在学校和编程猫的学习中都收获了很好的成......
  • 零代码编程:用ChatGPT批量重命名多个子文件夹里面的文件标题名
    一个文件夹:D:\英语学习图书配套资源\亲子英语游戏书,这本最好玩,里面有多个子文件夹:子文件夹里面的文件要重命名,将文件名称中的track替换为子文件夹名称:在ChatGPT中输入提示词:你是一个Python编程专家,要完成一个批量删除掉对话音频文件开头的任务,具体步骤如下:打开文件夹:D:\英语学习图......
  • [Linux] shell编程之数组 [转载]
    1概述数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。2定义数组2.1一维索引数组方法1#定义一个空数组array=()#为数组元素赋值array1[0]=aarray1[1]=barray......
  • Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
    一、前言在现代软件开发中,事务处理是必不可少的一部分。当多个操作需要作为一个整体来执行时,事务可以确保数据的完整性和一致性,并避免出现异常和错误情况。在SpringBoot框架中,我们可以使用声明式事务和编程式事务来管理事务处理。其中事务的坑也是不少,比较常见的就是事务失效,大家......
  • Java网络编程实现一(服务器)对多(客户端)
    使用多线程+网络编程实现一个服务器对多个客户端在该程序中用到的知识点java的BIOServerSocket和Socket网络编程多线程的知识(个人认为重要)实现的思路服务器端(使用多个线程)在客户端需要有一个集合来存储已经连接上的客户端,如果客户端断开连接则需要从集合中删除创建一......
  • JUC并发编程学习笔记(四)8锁现象
    8锁现象八锁->就是关于锁的八个问题锁是什么,如何判断锁的是谁对象、class模板深刻理解锁锁的东西无外乎就两样:1、同步方法的调用者,2、Class模板。同一个锁中,只有当前线程资源释放后才会被下一个线程所接手。同步方法的调用者是两个不同的实例时,互不相关。静态同步方法(s......
  • java 网络编程之传输文件
    需要建两个类,分别作为服务器(接收文件)和客户端(发送文件) 1.服务器类:1package菜鸟教程.网络编程.网络编程之传输文件;23importjava.io.*;4importjava.net.InetAddress;5importjava.net.ServerSocket;6importjava.net.Socket;78/**9*服......