首页 > 其他分享 >多线程中Callable简单使用

多线程中Callable简单使用

时间:2022-10-20 00:12:47浏览次数:52  
标签:util java new Callable concurrent result 简单 import 多线程

Callable接口具备的特征如下

1.有简单的类型参数,与call()方法的返回类型相对应

2.声明了call方法,执行器运行任务时,该方法会被执行器执行,它必须返回声明中指定类型的对象

3.call()方法可以抛出任何一种校验异常,可以实现自己的执行器重载afterExecute方法来处理这些异常

 

package com.java.test.callable;

import lombok.extern.slf4j.Slf4j;

import java.util.UUID;
import java.util.concurrent.Callable;

/**
 * @author yourheart
 * @Description
 * @create 2022-10-19 22:50
 */
@Slf4j
public class ThreadCallable implements Callable<String> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    @Override
    public String call() throws Exception {
        Thread.sleep(5000);
        log.info("call执行中...");
        return UUID.randomUUID().toString();
    }
}

  

package com.java.test.callable;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author yourheart
 * @Description
 * @create 2022-10-19 22:51
 */
@Slf4j
public class CallableTest {

    /**
     * 核心线程数
     */
    int corePoolSize = 3;
    /**
     * 最大线程数
     */
    int maximumPoolSize = 6;
    /**
     * 超过 corePoolSize 线程数量的线程最大空闲时间
     */
    long keepAliveTime = 2;
    /**
     * 以秒为时间单位
     */
    TimeUnit unit = TimeUnit.SECONDS;
    /**
     * 创建工作队列,用于存放提交的等待执行任务
     */
    BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(2);

    @Test
    /**
     * 执行器测试
     */
    public void  actuatorTest() throws ExecutionException, InterruptedException {
        ThreadCallable threadCallable = new ThreadCallable();
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                new ThreadPoolExecutor.AbortPolicy()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                /**
                 * 当call方法中执行有错误,可以在这里处理
                 */
               // super.afterExecute(r, t);
                log.info("afterExecute 任务执行结束了....:{}",t);
            }
        };

        Future<String> submit = poolExecutor.submit(threadCallable);
        String result = submit.get();
        log.info("result:{}",result);
        poolExecutor.shutdown();

    }
    public void test() throws ExecutionException, InterruptedException {
        ThreadCallable threadCallable = new ThreadCallable();
        FutureTask<String> futureTask = new FutureTask<>(threadCallable);

        //启动线程,执行callable的业务
        new Thread(futureTask).start();
         //同步等待返回结果
        String result = futureTask.get();
        log.info("输出线程的返回结果:{}",result);
    }
}

  

 

标签:util,java,new,Callable,concurrent,result,简单,import,多线程
From: https://www.cnblogs.com/q202105271618/p/16808166.html

相关文章

  • flutter 简单静态列表
    classListextendsStatelessWidget{constList({Key?key}):super(key:key);@overrideWidgetbuild(BuildContextcontext){returnListView(......
  • 多线程
    多线程基础线程简介任务进程(Process)一个进程可以有多个线程线程(Thread)多线程核心线程就是独立的执行路径在程序运行时,即使没有自己创建的线......
  • Python - jsonpath 简单使用
    第三方包使用的时候需要单独安装使用场景:快速提取接口返回的JSON串中的某一个字段的值importjsonimportjsonpathjson_str='''{"success":tru......
  • 使用CSS变量实现主题定制真的很简单
    本文为Varlet组件库源码主题阅读系列第六篇,Varlet支持自定义主题及暗黑模式,本篇文章我们来详细看一下这两者的实现。主题定制Varlet是通过css变量来组织样式的,什么是cs......
  • 青少年CTFmisc简单的送分题
    实话实说这不是一般人能做的可能我菜打开flag密码记事本密码平台名字就是qsnctf或多试试其他组合然后维吉尼亚解密接着base64我感觉这个有问题得到密码解flag2一张图......
  • 视频直播系统源码,简单的移动端轮播图
    视频直播系统源码,简单的移动端轮播图1.页面布局1.1页面框架 <body>  <divclass="box">    <divclass="tupian">      <imgsrc="4.webp"......
  • 系统日志防黑简单加固(lsattr、chattr)
    0x01命令简单介绍文件查看命令()lsattr:查看文件的扩展属性,如果文件被chattr+i  添加了写保护, 用lsattr可以看到添加的属性ls:  ls-a查看所有文件    ......
  • 多线程 学习
    ​​http://www.vchome.net/dotnet/dotnetdocs/dotnet1.htm​​作者:沐雪文章均系作者原创或翻译,如有错误不妥之处,欢迎各位批评指正。本文版权归作者有,如需......
  • 我的Vue之旅 07 Axios + Golang + Sqlite3 实现简单评论机制
    第三期·使用Vue3.1+TailWind.CSS+Axios+Golang+Sqlite3实现简单评论机制效果图CommentArea.vue我们需要借助js的Data对象把毫秒时间戳转化成UTCStrin......
  • 扔掉工具类!MyBatis 一个简单配置搞定加密、解密,不能太方便了~!
    来源:juejin.cn/post/6963811586184052767前言:介绍一个简单的MyBatis加解密方式,日常学习工作中提及这种方法的比较少,所以拿来说说,如果已经知道这种方法的忽略本文!一、背景......