Java 线程池ExecutorService运行原理 和FutureTask 的使用

一.线程池ExecutorService运行原理

ThreadPoolExecutor中有corePoolSize(核心线程)和maximumPoolSize(工作线程),默认核心线程和工作线程数量一致。1.当线ExecutorService线程池,使用submit,或者execute时2.先判断运行中的线程是否大于corePoolSize(核心线程)数量3.如果大于corePoolSize(核心线程)且maximumPoolSize(工作线程)未满则把该线程存着到工作线程等待。4.如果大于corePoolSize(核心线程)且maximumPoolSize(工作线程)满了则抛出异常(可配置处理策略)。5.如果小于corePoolSize(核心线程)则把该线程立即运行。

二.代码实现
package com.springboot.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.*;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args)throws InterruptedException, ExecutionException {
        SpringApplication.run(DemoApplication.class, args);

        //定义线程池,ThreadPoolExecutor的方法实现,
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        //用 FutureTask 包装线程 可以得到返回值
        //isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
        //isDone方法表示任务是否已经完成,若任务完成,则返回true;
        //get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
        //get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。
        FutureTask<String> futureTaskCallable = new FutureTask<>(new TaskCallable());
        executorService.submit(futureTaskCallable);
        //打印执行结果
        System.out.println("执行结果:"+futureTaskCallable.get());

        //submit 方法 本质上也是调了execute 仅仅做了一个返回值包装而已。
        //Runnable 类 submit execute 都可以执行
        executorService.submit(new TaskRunnable());
        executorService.execute(new TaskRunnable());
        //Callable类 只能 submit
        executorService.submit(new TaskCallable());

        //shutdown()与 shutdownNow() 的区别
        executorService.shutdown();//关闭线程池,不允许增加新的线程,但已有线程继续运行至结束。
        executorService.shutdownNow();//关系线程池,线程池里的线程,立即停止执行。
    }
}
//实现Runnable 实现 run 方法
class TaskRunnable implements Runnable{
    @Override
    public void run(){
        System.out.println(Thread.currentThread().getName()
                +"##########实现 Runnable 重写 run方法############");
    }
}
//实现Callable call方法
class TaskCallable implements Callable<String>{
    @Override
    public String call(){
        System.out.println(Thread.currentThread().getName()
                +"$$$$$$$$$$$实现Callable call方法$$$$$$$$$$$$$$");
        return Thread.currentThread().getName();
    }
}

 

原文地址:https://www.cnblogs.com/934827624-qq-com/p/9990451.html

时间: 2024-10-03 13:38:49

Java 线程池ExecutorService运行原理 和FutureTask 的使用的相关文章

这么说吧,java线程池的实现原理其实很简单

好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线程的可管理性. Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. demo 1.Executors.newFixedThreadPool(10)初始化一个包含10个线程的线程池ex

深入分析java线程池的实现原理

前言 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处:1.降低资源消耗:2.提高响应速度:3.提高线程的可管理性. Java1.5中引入的Executor框架把任务的提交和执行进行解耦,只需要定义好任务,然后提交给线程池,而不用关心该任务是如何执行.被哪个线程执行,以及什么时候执行. 如果你也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪.我们

Java线程池Executors.newFixedThreadPool原理解析

从事Java多线程开发的程序员来说,了解Java的线程池实现原理是必不可少的,以下将会结合Java线程池代码来说明它的实现原理,首先,我们要思考: 线程池的表现形式 线程池里面的线程什么时候创建 线程池里面的线程什么时候结束或者该不该结束 线程池的实现原理 说道Java线程池就不得不说ExecutorService接口和Executors类了,从源码上来看Executors类里面封装了线程池的创建,并且定义了各自不同的线程池类型,本文着重讲Executors这个类的newFixedThreadP

Java 线程池---ExecutorService

1.线程池 1.1什么情况下使用线程池 单个任务处理的时间比较短. 将需处理的任务的数量大. 1.2使用线程池的好处 减少在创建和销毁线程上所花的时间以及系统资源的开销. 如果不使用线程池,有可能造成系统创建大量线程而导致消耗系统内存以及"过度切换"; 2.ExecutorService和Executors 2.1简介 ExecutorService是一个接口,继承了Executor, public interface ExecutorService extend Executor{

Java线程池ExecutorService和CountDownLatch的小例子

import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下.当所有人都到达终点时,比赛结束. * @author liuchao * */ public class Actor { public static void main(

Java线程池 ExecutorService了解一下

本篇主要涉及到的是java.util.concurrent包中的ExecutorService.ExecutorService就是Java中对线程池的实现. 一.ExecutorService介绍 ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法:  Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类: 1. ThreadPoolExe

深入源码分析Java线程池的实现原理

程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对CPU利用的优化手段. 网上有不少介绍如何使用线程池的文章,那我想说点什么呢?我希望通过学习线程池原理,明白所有池化技术的基本设计思路.遇到其他相似问题可以解决. 池化技术 前面提到一个名词--池化技术,那么到底什么是池化技术呢? 池化技术简单点来说,就是提前保存大量的资源,以备不时之需.在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用

Java 线程池概念、原理、简单实现

线程池的思想概述 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间.那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?Java中可以通过线程池来达到这样的效果.下面们就来详细讲解一下Java的线程池. 线程池概念 线程池其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省

【Java线程】Java线程池ExecutorService

示例 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; public class Ch09_Executor { private static void run(ExecutorService threadPool) { for(int i = 1; i < 5; i++)