线程池常用的方法介绍

线程池的一些方法

提交线程任务

threadPool.submit(Runnable task)
threadPool.submit(Callable<T> task)

关闭线程池

/*
	调用这个方法线程池不会立即关闭,而是会等到所有线程执行完毕,还有
	阻塞队列中的任务执行完毕后,再关闭。在此期间,线程池也会启用拒绝策略,
	拒绝新的任务提交
*/
threadPool.shutdown() 
/*
	调用这个方法,它会给所有线程发送 interrupt信号,尝试中断这些任务,然
	后将任务队列中的任务转移到一个list中并返回,接下来就看你要不要处理了
*/
threadPool.shutdownNow()

测试下其它方法

public class ThreadPoolMethod{


    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(6, 10, 3l, TimeUnit.SECONDS,
                new ArrayBlockingQueue<Runnable>(4),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        for (int i = 0; i < 20; ++i){
            threadPool.submit(thread);
            System.out.println("-------------------------------------------------------------");
            System.out.println("线程池的核心线程数:" + threadPool.getCorePoolSize());
            System.out.println("线程池的历史中存在的最大线程数的个数:" + threadPool.getLargestPoolSize());
            System.out.println("线程池允许创建的最大线程数:" + threadPool.getMaximumPoolSize());
            System.out.println("线程池中当前的线程数:" + threadPool.getPoolSize());
            System.out.println("线程池中当前队列:" + threadPool.getQueue());
            System.out.println("线程池中曾经执行完成过的任务的大致总数:" + threadPool.getCompletedTaskCount());
            System.out.println("线程池中曾经计划的任务的大致总数:" +threadPool.getTaskCount());
            System.out.println("线程池中当前的拒绝策略:" + threadPool.getRejectedExecutionHandler());
        }
    }
}

在这里插入图片描述

首先呢,自己手动创建了一个线程池:

  • 核心线程为:6
  • 最大线程数为:10
  • 空闲线程存活时间:3L
  • 空闲线程存活时间的单位:秒
  • 阻塞队列:ArrayBlockingQueue(4),最多可以放4个任务,跟Array数组不同,它一经创建,长度就是不可以改变了
  • 创建线程的工厂:Executors.defaultThreadFactory(),我用了默认的创建线程的工厂,虽然不知道里面实现的样子,有兴趣的可以自己看
  • 拒绝策略:AbortPolicy,当阻塞队列满了且创建的线程数超出最大的线程数,线程池会抛出 RejectedExecutionException,这时候你就可以根据这个异常来看怎么处理了。当然了,这个是AbortPolicy才有的,如果是其它拒绝策略就有所不同了(功能上)

getCorePoolSize

获取核心线程数,这不是显示当前的线程数,是总共可以创建多少个核心线程数

getLargestPoolSize

之前线程池中,存在过的最大线程的数目

getMaximumPoolSize

获取当前线程池允许创建的最大线程数

getPoolSize

获取当前存活在线程池中的线程的个数

getQueue

获取当前队列中存在的任务

getCompletedTaskCount

获取曾经执行完成过的任务大致总数,为啥是大致呢?因为你在调用的时候,要是刚好有个线程完成任务,那数量就变化了

getTaskCount

获取当前线程曾经计划执行的个数,也就是执行过了多少个线程,启动的时候就算数的

getRejectedExecutionHandler

获取当前线程池的拒绝策略


其实还有几个方法,但突然不想写了


欢迎大家关注下个人的「公众号」:独醉贪欢

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,有多种方式可以实现方法的异步处理。下面介绍几种常用的处理异步方法的方式: 1. 使用线程池:可以使用Java提供的`ExecutorService`和`ThreadPoolExecutor`等线程池相关类来执行方法的异步处理。通过将方法包装为`Runnable`或`Callable`对象提交给线程池线程池会负责异步执行方法并返回结果。 2. 使用`CompletableFuture`:`CompletableFuture`是Java 8引入的一个类,用于处理异步任务和异步结果。你可以使用`CompletableFuture.supplyAsync()`或`CompletableFuture.runAsync()`方法来执行异步方法,并使用回调函数处理方法的结果。 3. 使用`@Async`注解:Spring框架提供了`@Async`注解,可以用于将方法标记为异步执行。在使用`@Async`注解时,需要在Spring配置中启用异步支持,并在方法上添加该注解,Spring会自动创建线程池来执行异步方法。 4. 使用Java并发工具类:Java提供了多种并发工具类,如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等。这些工具类可以用于协调多个线程的执行,实现异步处理。 无论采用哪种方式,异步处理方法都需要注意以下几点: - 异步方法需要返回一个表示异步结果的对象,如`Future`、`CompletableFuture`等。 - 异步方法的执行不会阻塞主线程,主线程可以继续执行其他任务。 - 异步方法的执行时间可能会比同步方法长,需要权衡时间和资源的使用。 - 异步方法的结果需要通过回调函数、阻塞等方式获取和处理。 需要根据具体的业务需求和场景选择合适的异步处理方式。同时,要注意处理异步方法时线程安全、异常处理、资源释放等问题,以保证代码的正确性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值