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

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

在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

 import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; public class ThreadPoolDemo { public static void main(String[] args) throws InterruptedException, ExecutionException { int processors = Runtime.getRuntime().availableProcessors();// 获得计算机有几个内核
// System.out.println("pro : " + processors); //第一种线程池:固定个数的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(processors * 100);// 固定线程个数的线程池 让一个CPU核绑定100个线程,这种方式经常使用.
// System.out.println(fixedThreadPool);
for (int i = 0; i < 10; i++) {
fixedThreadPool.execute(new Runnable() { @Override
public void run() {
System.out.println(Thread.currentThread().getName());// pool-1-thread-1
}
});
} fixedThreadPool.shutdown();// 将线程池关闭 在做项目的时候一般是不会将线程池关闭的. //=======================================================================================================
//第二种线程池:缓存的线程池 空闲的线程会被循环的利用,线程池中30条线程也许可以处理100个并发
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 缓存线程池,无上限 for (int i = 0; i < 100; i++) {
cachedThreadPool.execute(new Runnable() { @Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
cachedThreadPool.shutdown(); //======================================================================================================
//第三种线程池:单一线程池 当你想确保你的机器中只有一个线程运行,即使这个线程即使死了,也能原地满血复活,再有一个线程.
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();// 单一线程池,永远会维护存在一条线程 for (int i = 0; i < 10; i++) {
final int j = i;
singleThreadPool.execute(new Runnable() { @Override
public void run() {
/*
* if(j == 3) throw new RuntimeException("出异常了...");
*/
System.out.println(Thread.currentThread().getName() + ":"
+ j);
}
});
}
singleThreadPool.shutdown();
//=========================================================================================================
//第四种线程池:固定个数的线程池,相比于第一个固定个数的线程池 强大在 ①可以执行延时任务,②也可以执行带有返回值的任务。
//scheduledThreadPool.submit(); 执行带有返回值的任务
//scheduledThreadPool.schedule() 用来执行延时任务.
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);//固定个数的线程池,可以执行延时任务,也可以执行带有返回值的任务。 FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println("hello");
return Thread.currentThread().getName();
}
});
scheduledThreadPool.submit(ft);
String result = ft.get();//通过FutureTask对象获得返回值.
System.out.println("result : "+result); scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" : bobm!");
}
}, 3, TimeUnit.SECONDS);
}
}

JDK提供的四种线程池代码详解的更多相关文章

  1. javaSE中JDK提供的四种线程池

    对javaSE中JDK提供的四种线程池稍作整理   一.Executor   package java.util.concurrent; /** * @since 1.5 * @author Doug ...

  2. JDK提供的四种线程池

    一.线程池什么时候用,有什么好处? “线程池”顾名思义,就是存放线程的池子,这个池子可以存放多少线程取决于采用哪种线程池,取决于有多少并发线程,有多少计算机的硬件资源.使用线程池最直接的好处就是:线程 ...

  3. JDK提供的几种线程池比较

    JDK提供的几种线程池 newFixedThreadPool创建一个指定工作线程数量的线程池.每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中. ...

  4. JAVA基础知识|Executors提供的四种线程池

    一.Thread与Executors 开启新的线程,我们经常会采用如下方法: Thread thread =new Thread(new Runnable() { @Override public v ...

  5. Executors提供的四种线程池和自定义线程池

    JAVA并发编程——EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象 ...

  6. Executors提供的四种线程池

    Java 5+中的Executor接口定义一个执行线程的工具.它的子类型即线程池接口是ExecutorService.要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,因此在工具 ...

  7. Java四种线程池的学习与总结

    在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任 ...

  8. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  9. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

随机推荐

  1. s5-14 链路状态路由选择

    为什么DV逐渐让位于LS? DV  站的不高,看得不远  完全相信邻居 LS  想办法站得高,看更远  多高.多远?  怎么做? 链路状态路由(Link State) 主要思想 发现 它的邻 ...

  2. c#用EPPLUS操作excel

    参考: http://www.cnblogs.com/rumeng/p/3785748.html http://www.cnblogs.com/libla/p/5824296.html#3818995 ...

  3. JDK 1.5、1.6 & 中文版API,J2EE5API大全(借鉴)

    个人分类: Java文档           Sun 公司提供的Java API Docs是学习和使用Java语言中最经常使用的参考资料之一.但是长期以来此文档只有英文版,对于中国地区的Java开发者 ...

  4. 小论文matlab作图技巧

    小论文matlab作图技巧 编辑->复制选项 编辑->图形属性 图中右击->字型 编辑->复制图片,即可. 效果: 宽:5.9高: 7.91

  5. 【慕课网实战】Spark Streaming实时流处理项目实战笔记五之铭文升级版

    铭文一级: 单节点单broker的部署及使用 $KAFKA_HOME/config/server.propertiesbroker.id=0listenershost.namelog.dirszook ...

  6. 使用 vs.php 调试PHP相关问题

    1. 使用mysql_connect()方法时报错"Call to undefined function mysql_connect()" 这是由于在php.ini没有启用mysq ...

  7. (转)忘记wamp-mysql数据库root用户密码重置方法

    转自:http://www.jb51.net/article/28883.htm 1.打开任务管理器,结束进程  mysqld-nt.exe . 2.运行命令窗口 1)进行php服务管理器安装目录中的 ...

  8. STM32F10X-定时器/计数器

    1.STM32F10X的计数器与定时器关系 当时钟连接外脉冲时是计数器:当时钟采用系统内部时钟时是定时器! 2.STM32F10X定时器的时钟源 STM32F10X定时器的时钟不是直接来至于APB1和 ...

  9. java锁类型

    转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...

  10. 第88讲:Scala中使用For表达式实现map、flatMap、filter

    今天我们来学习一下如何使用for表达式实现map.flatMap以及filter 首先,我们来看下map.map的功能是,传入一个list,通过一个函数f,将list中的元素A变成元素B的过程.最后得 ...