知识大全 Java代码构建一个线程池
Posted 知
篇首语:案头见蠹鱼,犹胜凡俦侣。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java代码构建一个线程池相关的知识,希望对你有一定的参考价值。
Java代码构建一个线程池 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
本示例程序由三个类构成 第一个是TestThreadPool类 它是一个测试程序 用来模拟客户端的请求 当你运行它时 系统首先会显示线程池的初始化信息 然后提示你从键盘上输入字符串 并按下回车键 这时你会发现屏幕上显示信息 告诉你某个线程正在处理你的请求 如果你快速地输入一行行字符串 那么你会发现线程池中不断有线程被唤醒 来处理你的请求 在本例中 我创建了一个拥有 个线程的线程池 如果线程池中没有可用线程了 系统会提示你相应的警告信息 但如果你稍等片刻 那你会发现屏幕上会陆陆续续提示有线程进入了睡眠状态 这时你又可以发送新的请求了
第二个类是ThreadPoolManager类 顾名思义 它是一个用于管理线程池的类 它的主要职责是初始化线程池 并为客户端的请求分配不同的线程来进行处理 如果线程池满了 它会对你发出警告信息
最后一个类是SimpleThread类 它是Thread类的一个子类 它才真正对客户端的请求进行处理 SimpleThread在示例程序初始化时都处于睡眠状态 但如果它接受到了ThreadPoolManager类发过来的调度信息 则会将自己唤醒 并对请求进行处理
首先我们来看一下TestThreadPool类的源码
//TestThreadPool java
import java io *;
public class TestThreadPool
public static void main(String[] args)
try
BufferedReader br = new BufferedReader(new InputStreamReader(System in));
String s;
ThreadPoolManager manager = new ThreadPoolManager( );
while((s = br readLine()) != null)
manager process(s);
catch(IOException e)
由于此测试程序用到了输入输入类 因此第 行导入了JAVA的基本IO处理包 在第 行中 我们创建了一个名为manager的类 它给ThreadPoolManager类的构造函数传递了一个值为 的参数 告诉ThreadPoolManager类 我要一个有 个线程的池 给我创建一个吧!第 行至 行是一个无限循环 它用来等待用户的键入 并将键入的字符串保存在s变量中 并调用ThreadPoolManager类的process方法来将这个请求进行处理
下面我们再进一步跟踪到ThreadPoolManager类中去 以下是它的源代码
//ThreadPoolManager java
import java util *;
class ThreadPoolManager
private int maxThread;
public Vector vector;
public void setMaxThread(int threadCount)
maxThread = threadCount;
public ThreadPoolManager(int threadCount)
setMaxThread(threadCount);
System out println( Starting thread pool );
vector = new Vector();
for(int i = ; i <= ; i++)
SimpleThread thread = new SimpleThread(i);
vector addElement(thread);
thread start();
public void process(String argument)
int i;
for(i = ; i <vector size(); i++)
SimpleThread currentThread = (SimpleThread)vector elementAt(i);
if(!currentThread isRunning())
System out println( Thread + (i+ ) + is processing: +
argument);
currentThread setArgument(argument);
currentThread setRunning(true);
return;
if(i == vector size())
System out println( pool is full try in another time );
//end of class ThreadPoolManager
我们先关注一下这个类的构造函数 然后再看它的process()方法 第 - 行是它的构造函数 首先它给ThreadPoolManager类的成员变量maxThread赋值 maxThread表示用于控制线程池中最大线程的数量 第 行初始化一个数组vector 它用来存放所有的SimpleThread类 这时候就充分体现了JAVA语言的优越性与艺术性 如果你用C语言的话 至少要写 行以上的代码来完成vector的功能 而且C语言数组只能容纳类型统一的基本数据类型 无法容纳对象 好了 闲话少说 第 - 行的循环完成这样一个功能 先创建一个新的SimpleThread类 然后将它放入vector中去 最后用thread start()来启动这个线程 为什么要用start()方法来启动线程呢?因为这是JAVA语言中所规定的 如果你不用的话 那这些线程将永远得不到激活 从而导致本示例程序根本无法运行
下面我们再来看一下process()方法 第 - 行的循环依次从vector数组中选取SimpleThread线程 并检查它是否处于激活状态(所谓激活状态是指此线程是否正在处理客户端的请求) 如果处于激活状态的话 那继续查找vector数组的下一项 如果vector数组中所有的线程都处于激活状态的话 那它会打印出一条信息 提示用户稍候再试 相反如果找到了一个睡眠线程的话 那第 - 行会对此进行处理 它先告诉客户端是哪一个线程来处理这个请求 然后将客户端的请求 即字符串argument转发给SimpleThread类的setArgument()方法进行处理 并调用SimpleThread类的setRunning()方法来唤醒当前线程 来对客户端请求进行处理
可能你还对setRunning()方法是怎样唤醒线程的有些不明白 那我们现在就进入最后一个类 SimpleThread类 它的源代码如下
//SimpleThread java
class SimpleThread extends Thread
private boolean runningFlag;
private String argument;
public boolean isRunning()
return runningFlag;
public synchronized void setRunning(boolean flag)
runningFlag = flag;
if(flag)
this notify();
public String getArgument()
return this argument;
public void setArgument(String string)
argument = string;
public SimpleThread(int threadNumber)
runningFlag = false;
System out println( thread + threadNumber + started );
public synchronized void run()
try
while(true)
if(!runningFlag)
this wait();
else
System out println( processing + getArgument() + done );
sleep( );
System out println( Thread is sleeping );
setRunning(false);
catch(InterruptedException e)
System out println( Interrupt );
//end of run()
//end of class SimpleThread
如果你对JAVA的线程编程有些不太明白的话 那我先在这里简单地讲解一下 JAVA有一个名为Thread的类 如果你要创建一个线程 则必须要从Thread类中继承 并且还要实现Thread类的run()接口 要激活一个线程 必须调用它的start()方法 start()方法会自动调用run()接口 因此用户必须在run()接口中写入自己的应用处理逻辑 那么我们怎么来控制线程的睡眠与唤醒呢?其实很简单 JAVA语言为所有的对象都内置了wait()和notify()方法 当一个线程调用wait()方法时 则线程进入睡眠状态 就像停在了当前代码上了 也不会继续执行它以下的代码了 当调用notify()方法时 则会从调用wait()方法的那行代码继续执行以下的代码 这个过程有点像编译器中的断点调试的概念 以本程序为例 第 行调用了wait()方法 则这个线程就像凝固了一样停在了 行上了 如果我们在第 行进行一个notify()调用的话 那线程会从第 行上唤醒 继续从第 行开始执行以下的代码了
通过以上的讲述 我们现在就不难理解SimpleThread类了 第 - 行通过设置一个标志runningFlag激活当前线程 第 - 行是SimpleThread类的构造函数 它用来告诉客户端启动的是第几号进程 第 - 行则是我实现的run()接口 它实际上是一个无限循环 在循环中首先判断一下标志runningFlag 如果没有runningFlag为false的话 那线程处理睡眠状态 否则第 - 行会进行真正的处理 先打印用户键入的字符串 然后睡眠 秒钟 为什么要睡眠 秒钟呢?如果你不加上这句代码的话 由于计算机处理速度远远超过你的键盘输入速度 因此你看到的总是第 号线程来处理你的请求 从而达不到演示效果 最后第 行调用setRunning()方法又将线程置于睡眠状态 等待新请求的到来
最后还有一点要注意的是 如果你在一个方法中调用了wait()和notify()函数 那你一定要将此方法置为同步的 即synchronized 否则在编译时会报错 并得到一个莫名其妙的消息 current thread not owner (当前线程不是拥有者)
cha138/Article/program/Java/hx/201311/26937相关参考
典型Java线程池的代码及其各部分功能介绍 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ()根
在现代的操作系统中有一个很重要的概念――线程几乎所有目前流行的操作系统都支持线程线程来源于操作系统中进程的概念进程有自己的虚拟地址空间以及正文段数据段及堆栈而且各自占有不同的系统资源(例如文件环境
构建多线程Java应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 大多数服务端应用程序都
构建一个新的线程的代价还是有些高的因为它涉及与操作系统的交互如果你的程序创建了大量生存期很短的线程那就应该使用线程池一个线程池包含大量准备运行的空闲线程你将一个Ru
一般服务器端代码每次收到一个线程一个client就会产生 /************************开始监听**************************/ intport=;
Java线程控制权源代码的深入探讨 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java线程控
Java线程通信源代码中的奥秘探究 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java线程通
Java实现通用线程池 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 线程池通俗的描述就是预先创
知识大全 ant - java 构建工具 - hello ant
管理你的代码doc文件编译配置等开发工作你是怎末做的自己管理源目录编译文件copy实施在window写bat在unix写shell? 可惜我不怎末会写所以我制作一个ejb的过程是这样的写代码
JavaRunnable线程如何编写接口代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ja