侧边栏壁纸
博主头像
996worker

祇園精舎の鐘の聲, 諸行無常の響き有り。

  • 累计撰写 193 篇文章
  • 累计创建 46 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

Callable和FutureTask使用速记

996worker
2021-12-18 / 0 评论 / 0 点赞 / 181 阅读 / 1,010 字
温馨提示:
本文最后更新于 2021-12-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Callable介绍

Callable和Thread, Runnable相比, 能带有返回值,可以处理异常. 一般和FutureTask一起使用.

基本用法代码

以下代码只是demo, 不推荐生产环境使用. 应该把所有多线程异步任务交给线程池.

FutureTask<Integer> futureTask = new FutureTask<>(new Callable01());
new Thread(futureTask).start();

// get()方法: 等待线程执行完成获取返回结果
System.out.println(futureTask.get());

其中, Callable01定义为:

public static class Callable01 implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            System.out.println("运行结果:" + i);
            return i;
        }
    }

线程池提交任务代码

生产环境下, 用线程池更高效.

线程池的创建(原生):


// 50: 核心线程数, 一直保存着Thread实例, 来了就干活; 
// 100最大线程数; 
// 10L存活时间, 某些核心线程池空闲超过存活时间后, 释放空间: (最大线程数 - 核心线程数);
// unit 时间单位;
// 阻塞队列: 如果任务有很多, 最大能排队多少个;
// 线程创建工厂;
// 如果阻塞队列满了, 新来的Thread该怎么办(拒绝策略).
ExecutorService threadPool = new ThreadPoolExecutor(
                50,
                100,
                10L,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(10000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        //定时任务的线程池
        ExecutorService service = Executors.newScheduledThreadPool(2);

此外还有其他种类的线程池, 可google.

0

评论区