博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDK提供的四种线程池代码详解
阅读量:6896 次
发布时间:2019-06-27

本文共 4664 字,大约阅读时间需要 15 分钟。

一.线程池什么时候使用,会给我们带来什么好处?

如果很多用户去访问服务器,用户访问服务器的时间是非常短暂的,那么有可能在创建线程和销毁线程上花费的时间会远远大于访问所消耗的时间,如果采用线程池会使线程重复使用大大的提高效率.

在JDK1.5之前就有了线程池的概念,不过需要我们手动的去实现ThreadPool,在API中并没有叫"线程池"这个名字,而是叫做"执行程序".

 

根据CPU的情况 初始化 固定线程个数的线程池.

获取CPU上有多少个核....int processors = Runtime.getRunntime().availableProcessors()  ;

 

JDK1.5之后提供了4中线程池.

第一种线程池:固定个数的线程池

① fixedThreadPool:固定个数的线程池  一般会根据当前计算机的硬件情况来设置具体的最大线程数

Executors.newFixedThreadPool(5); 

第二种线程池:缓存的线程池

②cachedThreadPool:缓存线程池,无上限.如果并发访问量比较小,就可以使用这个不用考虑太多的问题,如果并发量很大,使用这个线程池会对服务器产生一定的压力

Executors.newCachedThreadPool();

第三种线程池:单一线程池

③singleThreadPool:单一线程池中永远会有一条线程,如果这条线程出现异常了会新创建一条线程完成其他任务.

Executors.newSingleThreadExecutor();

第四种线程池:固定个数的线程池,相比于第一个固定个数的线程池强大在  ①可以执行延时任务,②也可以执行带有返回值的任务。

④scheduledThreadPool:固定个数的线程池,可以执行延时任务,也可以执行带有返回值的任务.

Executors.newScheduledThreadPool(5);

以上四种具体看代码:(注释和笔记更加详细)

如果上面的四个都不满足你的要求 可以自定义线程池....要实现ThreadFactory接口.....

 ThreadPoolDemo.java

1 import java.util.concurrent.Callable; 2 import java.util.concurrent.ExecutionException; 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 import java.util.concurrent.FutureTask; 6 import java.util.concurrent.ScheduledExecutorService; 7 import java.util.concurrent.TimeUnit; 8  9 public class ThreadPoolDemo {10 11     public static void main(String[] args) throws InterruptedException, ExecutionException {12 13         int processors = Runtime.getRuntime().availableProcessors();// 获得计算机有几个内核14         // System.out.println("pro : " + processors);15 16         //第一种线程池:固定个数的线程池17         ExecutorService fixedThreadPool = Executors.newFixedThreadPool(processors * 100);// 固定线程个数的线程池  让一个CPU核绑定100个线程,这种方式经常使用.18         // System.out.println(fixedThreadPool);19         for (int i = 0; i < 10; i++) {20             fixedThreadPool.execute(new Runnable() {21 22                 @Override23                 public void run() {24                     System.out.println(Thread.currentThread().getName());// pool-1-thread-125                 }26             });27         }28 29         fixedThreadPool.shutdown();// 将线程池关闭  在做项目的时候一般是不会将线程池关闭的.30 31 //=======================================================================================================32         //第二种线程池:缓存的线程池  空闲的线程会被循环的利用,线程池中30条线程也许可以处理100个并发33         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 缓存线程池,无上限34 35         for (int i = 0; i < 100; i++) {36             cachedThreadPool.execute(new Runnable() {37 38                 @Override39                 public void run() {40                     System.out.println(Thread.currentThread().getName());41                 }42             });43         }44         cachedThreadPool.shutdown();45 46 //======================================================================================================47         //第三种线程池:单一线程池  当你想确保你的机器中只有一个线程运行,即使这个线程即使死了,也能原地满血复活,再有一个线程.48         ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();// 单一线程池,永远会维护存在一条线程49 50         for (int i = 0; i < 10; i++) {51             final int j = i;52             singleThreadPool.execute(new Runnable() {53 54                 @Override55                 public void run() {56                     /*57                      * if(j == 3) throw new RuntimeException("出异常了...");58                      */59                     System.out.println(Thread.currentThread().getName() + ":"60                             + j);61                 }62             });63         }64         singleThreadPool.shutdown();65 //=========================================================================================================66         //第四种线程池:固定个数的线程池,相比于第一个固定个数的线程池 强大在   ①可以执行延时任务,②也可以执行带有返回值的任务。67         //scheduledThreadPool.submit(); 执行带有返回值的任务68         //scheduledThreadPool.schedule()  用来执行延时任务.69         ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);//固定个数的线程池,可以执行延时任务,也可以执行带有返回值的任务。70 71         FutureTask
ft = new FutureTask
(new Callable
() {72 @Override73 public String call() throws Exception {74 System.out.println("hello");75 return Thread.currentThread().getName();76 }77 });78 scheduledThreadPool.submit(ft);79 String result = ft.get();//通过FutureTask对象获得返回值.80 System.out.println("result : "+result);81 82 83 scheduledThreadPool.schedule(new Runnable() {84 @Override85 public void run() {86 System.out.println(Thread.currentThread().getName()+" : bobm!");87 }88 }, 3, TimeUnit.SECONDS);89 }90 }

 

转载地址:http://wcddl.baihongyu.com/

你可能感兴趣的文章
ubuntu一键安装LAMP 及一键卸载
查看>>
关于mysql数据库
查看>>
1、Intellij idea快捷键设置
查看>>
网页设计之字体和 CSS 调整
查看>>
纯键盘开发实战(Mouseless Programming)
查看>>
oracle闪回数据库在dataguard中的使用
查看>>
Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程
查看>>
css_兼容IE和FF的写法
查看>>
git中报错unable to auto-detect email address 解决办法
查看>>
“跨库分页”的四种方案
查看>>
nginx防盗链、访问控制、PHP解析、服务器代理
查看>>
解决微信web开发工具(当前系统不是安全代理,是否信任?)
查看>>
jQuery Ajax 讲解(总结)
查看>>
高阶函数
查看>>
一些SAP Partners能够通过二次开发实现打通C/4HANA和S/4HANA的方法介绍
查看>>
1.30 学习笔记——环境变量PATH、cp命令、mv命令、文档查看
查看>>
LINK:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
查看>>
区块链100讲:区块链的跨链技术
查看>>
ganache
查看>>
WebSocket
查看>>