import java.util.LinkedList; |
import java.util.List; |
/** |
* |
* Title: LoonFramework |
* |
* |
* Description: |
* |
* |
* Copyright: Copyright (c) 2007 |
* |
* |
* Company: LoonFramework |
* |
* |
* @author chenpeng |
* @email:ceponline@yahoo.com.cn |
* @version 0.1 |
*/ |
public class ThreadPool { |
private static ThreadPool instance = null ; |
// 优先级低 |
public static final int PRIORITY_LOW = 0 ; |
// 普通 |
public static final int PRIORITY_NORMAL = 1 ; |
// 高 |
public static final int PRIORITY_HIGH = 2 ; |
// 用以保存空闲连接 |
private List[] _idxThreads; |
// 关闭 |
private boolean _shutdown = false ; |
// 线程数量 |
private int _threadCount = 0 ; |
// debug信息是否输出 |
private boolean _debug = false ; |
/** */ |
/** |
* 返回ThreadPool实例 |
* |
* @return |
*/ |
public static ThreadPool getInstance() { |
if (instance == null ) { |
instance = new ThreadPool(); |
} |
return instance; |
} |
// 初始化线程list |
private ThreadPool() { |
this ._idxThreads = new List[] { new LinkedList(), new LinkedList(), |
new LinkedList() }; |
this ._threadCount = 0 ; |
} |
/** */ |
/** |
* 同步方法,完成任务后将资源放回线程池中 |
* |
* @param repool |
*/ |
protected synchronized void repool(Pooled repool) { |
if ( this ._shutdown) { |
if ( this ._debug) { |
System.out.println( "ThreadPool.repool():重设中……" ); |
} |
// 优先级别判定 |
switch (repool.getPriority()) { |
case Thread.MIN_PRIORITY: |
this ._idxThreads[PRIORITY_LOW].add(repool); |
break ; |
case Thread.NORM_PRIORITY: |
this ._idxThreads[PRIORITY_NORMAL].add(repool); |
break ; |
case Thread.MAX_PRIORITY: |
this ._idxThreads[PRIORITY_HIGH].add(repool); |
break ; |
default : |
throw new IllegalStateException( "没有此种级别" ); |
} |
// 通知所有线程 |
notifyAll(); |
} else { |
if ( this ._debug) { |
System.out.println( "ThreadPool.repool():注销中……" ); |
} |
repool.shutDown(); |
} |
if ( this ._debug) { |
System.out.println( "ThreadPool.repool():完成" ); |
} |
} |
public void setDebug( boolean debug) { |
this ._debug = debug; |
} |
public synchronized void shutDown() { |
this ._shutdown = true ; |
if ( this ._debug) { |
System.out.println( "ThreadPool.shutDown():关闭中……" ); |
} |
for ( int index = 0 ; index <= PRIORITY_NORMAL; index++) { |
List threads = this ._idxThreads[index]; |
for ( int threadIndex = 0 ; threadIndex < threads.size(); threadIndex++) { |
Pooled idleThread = (Pooled) threads.get(threadIndex); |
idleThread.shutDown(); |
} |
} |
notifyAll(); |
} |
/** */ |
/** |
* 以指定的优先级启动线程 |
* |
* @param target |
* @param priority |
*/ |
public synchronized void start(Runnable target, int priority) { |
Pooled thread = null ; |
List idleList = this ._idxThreads[priority]; |
int idleSize = idleList.size(); |
if (idleSize > 0 ) { |
int lastIndex = idleSize - 1 ; |
thread = (Pooled) idleList.get(lastIndex); |
idleList.remove(idleList); |
thread.setTarget(target); |
} else { |
this ._threadCount++; |
thread = new Pooled(target, "Pooled->" + this ._threadCount, this ); |
switch (priority) { |
case PRIORITY_LOW: |
thread.setPriority(Thread.MIN_PRIORITY); |
break ; |
case PRIORITY_NORMAL: |
thread.setPriority(Thread.NORM_PRIORITY); |
break ; |
case PRIORITY_HIGH: |
thread.setPriority(Thread.MAX_PRIORITY); |
break ; |
default : |
thread.setPriority(Thread.NORM_PRIORITY); |
} |
// 启动 |
thread.start(); |
} |
} |
/** */ |
/** |
* 返回线程数量 |
* |
* @return |
*/ |
public int getThreadsCount() { |
return this ._threadCount; |
} |
} |
/** |
* |
* Title: LoonFramework |
* |
* |
* Description: |
* |
* |
* Copyright: Copyright (c) 2007 |
* |
* |
* Company: LoonFramework |
* |
* |
* @author chenpeng |
* @email:ceponline@yahoo.com.cn |
* @version 0.1 |
*/ |
public class Pooled extends Thread { |
private ThreadPool _pool; |
private Runnable _target; |
private boolean _shutdown = false ; |
private boolean _idle = false ; |
public Pooled(Runnable target) { |
super (target); |
} |
public Pooled(Runnable target, String name) { |
super (target, name); |
} |
public Pooled(Runnable target, String name, ThreadPool pool) { |
super (name); |
this ._pool = pool; |
this ._target = target; |
} |
public Pooled(String name) { |
super (name); |
} |
public Pooled(ThreadGroup group, Runnable target) { |
super (group, target); |
} |
public Pooled(ThreadGroup group, Runnable target, String name) { |
super (group, target, name); |
} |
public Pooled(ThreadGroup group, String name) { |
super (group, name); |
} |
public Runnable getTarget() { |
return this ._target; |
} |
public boolean isIdle() { |
return this ._idle; |
} |
public void run() { |
while (! this ._shutdown) { |
this ._idle = false ; |
if ( this ._target != null ) { |
this ._target.run(); |
} |
this ._idle = true ; |
try { |
this ._pool.repool( this ); |
synchronized ( this ) { |
wait(); |
} |
} catch (InterruptedException ex) { |
System.err.println(ex.getMessage()); |
} |
this ._idle = false ; |
} |
} |
public synchronized void setTarget(Runnable target) { |
this ._target = target; |
notifyAll(); |
} |
public synchronized void shutDown() { |
this ._shutdown = true ; |
notifyAll(); |
} |
} |
//测试用类: |
package org.loon.framework.util.test; |
/** */ /** |
* Title: LoonFramework |
* Description:线程池测试 |
* Copyright: Copyright (c) 2007 |
* Company: LoonFramework |
* @author chenpeng |
* @email:ceponline@yahoo.com.cn |
* @version 0.1 |
*/ |
public class ThreadPoolTest { |
private static Runnable createRunnable( final int id) { |
return new Runnable() { |
public void run() { |
System.out.println( "线程" + id + ",运行 " ); |
try { |
Thread.sleep( 1000 ); |
} |
catch (InterruptedException ex) { } |
System.out.println( "线程" + id + ",结束" ); |
} |
}; |
} |
public static void main(String[]args) { |
ThreadPool pool=ThreadPool.getInstance(); |
pool.setDebug( true ); |
for ( int i= 1 ; i<= 10 ; i++) { |
//根据数值,设定不同优先级 |
if (i% 2 == 0 ) { |
pool.start(createRunnable(i), ThreadPool.PRIORITY_HIGH); |
} else { |
pool.start(createRunnable(i), ThreadPool.PRIORITY_LOW); |
} |
} |
System.out.println( "线程池测试中……" ); |
System.out.println( "线程池线程总数:" +pool.getThreadsCount()); |
pool.shutDown(); |
} |
} |