这个例子,是从网络上找到的,大概意思把线程池的概念给介绍了,而且介绍得不错。
但是程序有些问题,可能原作者没太注意,我增加了一句,使原程序更合理了,
如果有原作者看见,请见谅。
我还是大概回顾一下原理:
线程在进程空间里,分享共有变量,便于线程之间通讯。不同的线程相当于封装了不同
的代码,多线程同步运行,可以看成是多个代码段同步运行。
那么什么是线程池,原理和数据库连接池一样,都是为了能够复用已有的东西,降低系统
的开销。因此,一句大白话:需要有个容器包含这些线程,还得有个对象来负责调控使用
这些线程。
下面程序,有3个类组成:一个简单线程类(负责具体操作),一个管理线程类(负责调度)
,一个客户端模拟类,负责调用。
代码如下:
一个简单线程类
package simplethreadpool;
public 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 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(5000);
System.out.println("thread is sleeping");
setRunning(false);
}
}
} catch (InterruptedException e) {
// TODO: handle exception
System.out.println("InterruptedException");
}
}
}
一个管理线程类
package simplethreadpool;
import java.util.Vector;
public 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 = 0; i < 10; i++) {
SimpleThread thread = new SimpleThread(i);
vector.addElement(thread);
thread.start();
}
}
public void process(String argument) {
int i;
for (i = 0; i < vector.size(); i++) {
SimpleThread currentThread = (SimpleThread) vector.elementAt(i);
if (!currentThread.isRunning()) {
System.out.println("thread" + (i + 1) + "is processing::"
+ argument);
currentThread.setArgument(argument);
currentThread.setRunning(true);
break;//我新增的代码
}
if (i == (vector.size() - 1)) {
System.out.println("pool is full,try in another time.");
}
}
}
}
一个客户端模拟类
package simplethreadpool;
import java.io.*;
public class TestThreadPool {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
ThreadPoolManager manager = new ThreadPoolManager(10);
while((s=br.readLine())!= null){
manager.process(s);
}
} catch (IOException e) {
// TODO: handle exception
}
}
}
我运行了一下,确实不错,起码大体框架上让我明白了一些。