- 浏览: 47236 次
- 性别:
文章分类
- 全部博客 (103)
- 一致性哈希算法 (1)
- 云计算 (2)
- Cassandra学习 (2)
- Java网络通信与笔记 (14)
- ZooKeeper学习 (1)
- HBase学习 (1)
- Sqoop学习 (1)
- Java网页开发之 (2)
- Java网络通信框架 (5)
- (memcached)分布式内存对象缓存系统 (1)
- Redis学习 (5)
- Shell学习 (14)
- Linux学习 (10)
- MySQL优化 (17)
- C++ (7)
- HTML5 (5)
- Android学习 (5)
- 网络 (2)
- Node.js (1)
- D3.js (1)
- R语言学习 (3)
- Spark (1)
- CAN协议 (2)
- 解决方案 (0)
最新评论
线程池
在上一篇博客中,我们有提及阻塞IO的为每个连接请求建立一个线程或者放进线程池,如果我们还在每次都new一个线程的话,在庞大的连接数目下我们系统的性能将大大降低,更何况这些线程没有统一的管理,极有可能会产生大量的阻塞。
new Thread的弊端如下:
a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
Java 线程池
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
. newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
}
});
}
结果依次输出,相当于顺序执行各个任务。
现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。
. newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
表示延迟3秒执行。
定期执行示例代码如下:
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
表示延迟1秒后每3秒执行一次。
ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。
、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
结果依次输出,相当于顺序执行各个任务。
现行大多数GUI程序都是单线程的。Android中单线程可用于数据库操作,文件操作,应用批量安装,应用批量删除等不适合并发但可能IO阻塞性及影响UI线程响应的操作。
发表评论
-
Java之Concurrent(并发)包
2015-09-25 16:31 284因为实在是太多了,太长了,一时间无法自习整理和消化,先 ... -
Java集合框架
2015-09-25 16:31 363集合框架有很多的 ... -
final, finally, finalize的区别
2015-09-19 11:39 3561.final final修饰类,说明 ... -
四种会话跟踪技术
2015-09-19 11:36 749会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能 ... -
java中volatile关键字的含义
2015-09-19 10:59 342在java线程并发处理中, ... -
java笔记--关于线程同步(5种同步方式)
2015-09-19 10:21 386[size=medium]为何要使用同步? java ... -
RPC
2015-07-30 11:04 332RPC 功能目标 RPC 的 ... -
Java NIO原理文分析及代码实现
2015-07-22 10:43 395Java NIO原理图文分析及代码实现 前言: 最近在分 ... -
NIO学习(一)
2015-07-22 10:43 299[size=medium]NIO学习 一.NIO中的几个基础 ... -
Java IO浅谈
2015-07-21 13:12 274Java IO浅谈 [size=large] ... -
线程池(二)
2015-07-21 12:29 329Java ... -
多种IO设计模式
2015-07-21 11:45 427Java通信的几种IO设计 [size=large]阻塞IO ... -
阻塞与非阻塞-----同步与异步
2015-07-21 11:31 452阻塞(blocking)与非阻塞(non-blocking)I ...
相关推荐
这是一个简单线程池的实现,虽然有很多bug,但是能够简单地实现线程池。
完整线程池一系列基本操作包括添加,删除,投入执行任务
环境:Windows XP ...这里本人翻写一个通用的线程池类,它可以用来作为工具类处理许多多线程问题。代码注释非常详尽,一行注释一行代码。 阅读对象:非常熟悉Java的基本概念,并且熟悉命令行编写代码的人员。
网上有现成的cthreadpool的代码,是c版的,且没有任务队列功能,不能做到任务的安全退出,根据实际需要写了一个c++版的,本程序实现了c++的封装,并实现了任务池和线程安全退出。弥补了c版的不足 在linux调试通过并...
一个线程池的设计
使用步骤: 1.下载解压之后,在控制台运行javac ThreadPoolTest.java 2.然后根据提示运行java命令...这里本人翻写一个通用的线程池类,它可以用来作为工具类处理许多多线程问题。代码注释非常详尽,一行注释一行代码。
也就是说corePoolSize就是线程池大小,maximumPoolSize在我看来是线程池的一种补救措施,即任务量突然过大时的一种补救措施。 不过为了方便理解,在本文后面还是将corePoolSize翻译成核心池大小。 ...
springboot线程池使用的一个demo,注解开发,很简单,下载即用
Windows下一个比较完美的线程池实现和示例 本线程池提供了如下功能: 1.能根据任务个数和当前线程的多少在最小/最大线程个数之间自动调整(Vista后的系统有 SetThreadpoolThreadMaximum 等函数有类似功能); 2.能方便...
一个简单的线程池例子;
接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后线程池将工作项放入可用线程中。调用 eventX 上的 WaitOne 方法,这会使程序的其余部分等待,直到用 eventX.Set 方法触发...
以线程池的方式实现了一个http代理服务器
记一次使用线程池出现的问题(线程池异常).pdf记一次使用线程池出现的问题(线程池异常).pdf记一次使用线程池出现的问题(线程池异常).pdf记一次使用线程池出现的问题(线程池异常).pdf记一次使用线程池出现的...
一个Delphi线程池代码,里面的函数功能有:线程池停机(检查并清除空闲线程和死线程)、清除死线程,并补充不足的工作线程、释放 FThreadsKilling 列表中的线程、申请线程任务、清除死线程等。在本线程池中,新建...
所以源代码都有 ,一个完整的线程池的实例
易语言简易线程池的实现。...线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级
linux 实现一个简单的线程池及工作 本实例演示了线程池的创建使用
一个线程池封装类及例子程序,有英文文档和中文翻译。学习线程池很难得的资料
在linux下实现的一个简单的线程池,可以实现多任务机制,在linux下实现的一个简单的线程池,可以实现多任务机制
很经典的一个线程池应用,希望提供给有帮助的人