当前位置: 首页 > news >正文

线程池的使用

线程池的使用:给它一个任务,然后从线程池中获取线程,让这个线程来执行这个任务

main方法

package ThreadPool;/*
 *@author wanghongyuan
 *@Create 2021/1/7 21:01
 */

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/*
    JDK1.5之后提供的
    java.util.concurrent.Executors:线程池工厂类,用来生产线程池
    Executors类中的静态方法:
        static ExecutorService newFixedThreadPool(int nTreads)创建一个可重用固定线程数的线程池
        参数:
            int nThread:创建线程池中包含的线程数量
        返回值:
            ExecutorService接口类型,返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程)
    java.util.concurrent.ExecutorService:线程池接口
        用来从线程池中获取线程,调用start方法,执行线程任务
            submit(Runnable task)提交一个Runnable任务用于执行
        关闭/销毁线程池的方法
            void shutdown()
    线程池的使用步骤:
        1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。
        2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
        3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
        4.如果我不想用这个线程池了,我们可以销毁/关闭这个线程池,调用ExecutorService中的方法shutdown销毁线程池。(不建议使用)
 */
public class Demo01ThreadPool {
    public static void main(String[] args) {
        //1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池。
        ExecutorService es = Executors.newFixedThreadPool(3);
        //3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
        es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
        // 线程池会一直开启,使用完了线程,会自动把线程归还给线程池,线程可以继续使用
        es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
        es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
        es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
        es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
        es.submit(new RunnableImpl());//pool-1-thread-3创建了一个新的线程
        // 线程池不想用了可以使用shutdown();

        es.shutdown();
        /*
        Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@b1bc7ed[Not completed, task = java.util.concurrent.Executors$RunnableAdapter@1ddc4ec2[Wrapped task = ThreadPool.RunnableImpl@133314b]] rejected from java.util.concurrent.ThreadPoolExecutor@7cd84586[Shutting down, pool size = 3, active threads = 3, queued tasks = 3, completed tasks = 0]
	at java.base/java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2057)
	at java.base/java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:827)
	at java.base/java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1357)
	at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)

         */
        es.submit(new RunnableImpl());//抛异常,线程池都没有了,就不能获取线程了
    }
}

Runnable实现类

package ThreadPool;/*
 *@author wanghongyuan
 *@Create 2021/1/7 21:28
 */
//2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
public class RunnableImpl implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"创建了一个新的线程");
    }
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Lambda标准格式
  • File类的构造方法
  • 递归计算
  • 使用递归遍历目录
  • 对文本内容进行排序
  • 测试框架
  • 写个web自动化
  • 与全球外国人即时聊天的网站
  • 将GBK的文件转换成UTF-8的文件格式
  • 反序列化流de使用
  • 使用序列化和反序列化操作集合中的值
  • 接口的使用-常用的函数式接口举例
  • 学习个人项目课
  • 格式化打印信息,使用Consumer
  • predicate接口中的方法
  • bearychat的java client
  • Bytom交易说明(账户管理模式)
  • CSS相对定位
  • input实现文字超出省略号功能
  • Java 多线程编程之:notify 和 wait 用法
  • JS笔记四:作用域、变量(函数)提升
  • React16时代,该用什么姿势写 React ?
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 翻译:Hystrix - How To Use
  • 如何设计一个微型分布式架构?
  • 使用agvtool更改app version/build
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # 职场生活之道:善于团结
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #Z2294. 打印树的直径
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (19)夹钳(用于送货)
  • (23)Linux的软硬连接
  • (C++20) consteval立即函数
  • (ZT)薛涌:谈贫说富
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (六)vue-router+UI组件库
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)memcache、redis缓存
  • (转载)深入super,看Python如何解决钻石继承难题
  • (轉)JSON.stringify 语法实例讲解
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET MVC 验证码
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • // an array of int
  • /etc/skel 目录作用