进程是程序的一个动态执行过程,是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows
系统中,一个运行的exe就是一个进程。线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程
总是属于某个进程,进程中的多个线程共享进程的内存。“同时”执行是人的感觉,在线程之间实际上轮换执行。
实现多线程有两种手段,一种是集成Thread类,另一种就是实现Runnable接口。
在CPU和内存还有磁盘IO并没有充分利用的时候,就可以在重构的时候,使用线程操作,将过去需要占用一定时间的同步操作,进行并发处理。这样,创建多个线程来解决同一个问题。这样就可以使操作成为异步,不需要进行等待就可以同时操作很多事情。
那么线程需要创建多少呢?
每监听到一个请求就创建一个线程,然后操作之后就销毁。这种办法可行么?
如果突然在客户端提交了1000000
* N
个请求,这些请求都进入服务器,然后在这里,为每一个请求都创建一个线程来执行。这样程序就会失去控制。最终挤爆服务器CPU和内存,使程序崩溃。
怎么样合理、可控的处理操作,变成了重点。
线程池,顾名思义,在池化开发的现在,如数据库连接池这种开发模式已经广泛流行。
在池中创建连接实例,在访问数据库时,从连接池中取得连接,操作之后归还。这样就可以有效的限制资源数量,但是又能提高操作速度。
package test.dao;
import java.util.LinkedList;
import org.apache.log4j.Logger;
public class ThreadPool {
private static final Logger Log = Logger.getLogger(ThreadPool.class);
private ThreadWorker[] worker;
private LinkedList<Runnable> queue;
private int poolSize;
public int getPoolSize(){
return poolSize;
}
//initialize thread pool with pool size
public ThreadPool(int size){
poolSize = size;
worker = new ThreadWorker[size];
queue = new LinkedList<Runnable>();
for (int i = 0; i < size; i++) {
worker[i] = new ThreadWorker();
worker[i].start();
}
}
//add work queue
public void addQueue(Runnable runnable){
synchronized(queue) {
queue.add(runnable);
queue.notify();
}
}
//worker do work
private class ThreadWorker extends Thread{
public void run(){
//runnable
Runnable runable;
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try
{
//is work queue is empty, wait
queue.wait();
}
catch (Exception e)
{
Log.error("pool queue wait", e);
}
}
//get work in queue, and remove it
runable = queue.removeFirst();
}
try {
//do work
runable.run();
}
catch (RuntimeException e) {
Log.error("unknow runtime exception", e);
}
}
}
}
public static void main(String[] args) {
//test
ThreadPool pool = new ThreadPool(111);
//
class SSS implements Runnable{
private String abc;
public void setAbc(String aaaaa){
this.abc = aaaaa;
}
public void run() {
System.out.println("do runnable " + abc);
}
}
for (int i = 0; i < 200; i++) {
SSS a = new SSS();
a.setAbc(String.valueOf(i + 1));
pool.addQueue(a);
}
}
}
分享到:
相关推荐
主要介绍了Java 线程池详解及创建简单实例的相关资料,需要的朋友可以参考下
java线程池三种类型使用 使用举例,内容简单 篇幅较短
java 浮点数举例java 浮点数举例java 浮点数举例
JAVA多态图文详解ppt,详细通过各种举例介绍JAVA多态的ppt
一个详细的java常用API举例。。有代码和说明。希望可以帮助到你。
经典算法.pdf 算法举例详解 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 ...
VCc++的类举例详解.pdf
mpeg2-节目流结构举例详解: 包括ps结构——pack结构——系统头结构——packet结构——pes头结构——视频单元结构,通过具体文件数据对照说明
JAVA实验举例和事例 可以让初学者学习
对设计模式进行概括,通过一个示例详细讲解抽象工厂模式。
该文件里面包含JAVA开发常用的设计模式,通过举例、分析、代码示意的方式让读者很容易理解
本文档对NP完全问题详细解释,举了很多的例子 NP完全问题(NP-C问题),是世界七大数学难题之一。 NP的英文全称是Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题。简单的写法是 NP=P?...
java垃圾回收器机制,代码举例注释及个人笔记
对23中设计模式进行了详细的举例介绍。欢迎你的加入Java设计模式学习。 作者介绍: Rohit Joshi works as a Software Engineer in the Consumer Product Sector. He is a Sun Certified Java Programmer. He had ...
这是一个用java编写的词法分析举例程序,在学习编译原理时会用到。
主要介绍了举例详解Java中的访问权限修饰符,是Java入门学习中的基础知识,需要的朋友可以参考下
本文档对动态规划问题详细解释,举例很多,使初学者容易理解,绝对物超所值,希望大家下载观看 动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。
主要介绍了举例详解CSS的z-index属性的使用,文中给出了布局示例的结构图,需要的朋友可以参考下
本资料主要详细介绍JAVA 中各设计模式及其举例说明其用法
自己整理的关于全排列的递归程序.本例以数组{a,b,c}三个元素作为例子详细讲解。里面的程序都经过VC6.0运行通过,请读者放心使用