当前位置:文档之家› Java多线程池代码示例(可复用)

Java多线程池代码示例(可复用)


的中断状态不受该方法的影响。
//对于isInterrupted方法,如果该线程已经中断,则返回 true;否则返回
false
while (!isInterrupted())
{
//那么从线程池中获取一个任务对象来执行
Runnable task = null;
try
{
task = getTask();
}
{
super("线程池-" + (threadPoolID++));
setDaemon(true);//让该线程组为精灵线程组
isAlive = true;//设置初始值为true
taskQueue = new LinkedList<Runnable>();//初始化任务队列
for (int i = 0; i < numThreads; i++)
notifyAll();
}
// 然后等待所有池中的线程对象执行完毕
Thread[] threads = new Thread[activeCount()]; //创建所有池中的活动
线程
//把此线程组及其子组中的所有活动线程复制到指定数组中
int count = enumerate(threads);
//然后按序让每个线程执行完毕
for (int i = 0; i < count; i++)
{
try
{
threads[i].join();
}
catch (InterruptedException ei)
{
ei.printStackTrace();
}
}
}
/** * Created on * <p>Title:
String name),
*
把该线程分配指定的线程组对象中去]</p>
* @constructor 方法.
*/
public Pouper(ThreadPool.this, "池中线程(ID号)-" + (threadID++));
}
/**
* Created on
2013-12-11
* Created on
2013-12-11
* <p>Description: [关闭该线程池并且立即返回。让所有线程停止执行,并且所
有等待任务停止执行。一旦一个ThreadPool被关闭了,那么
该线程池中的所有的线程不再运行。]</p>
* @developer:
[开发者姓名][xgood68@]
{
//如果线程池的状态isAlive==false值
if (!isAlive)
{
throw new IllegalStateException();//那么抛出异常
}
//如果任务不为null
if (task != null)
{
//那么在任务把该任务加入任务阶段
taskQueue.add(task);
IllegalStateException)。]</p>
* @param task
表示运行的任务。如果不null,那么没有任务执行。
* @developer:
[开发者姓名][xgood68@]
* @update:
[日期YYYY-MM-DD][更改人姓名][E-mail]
*/
public synchronized void runTask(Runnable task)
* @developer
开发者姓名[xgood68@]
* @version
1.0
*/
public class ThreadPoolTest
{
/**
* Created on
2013-12-11
* <p>Description: [启动方法]</p>
* @param args
* @developer:
/** * <p>Description:[保存线程的ID]</p> * <p>Value:threadID</p> */
private int threadID;
/** * <p>Description:[表示线程池的ID]</p> * <p>Value:threadPoolID</p>
第1页共8页
2013-12-11 项目名称_[内部类]_[PooledThread类是Thread类对象,它是
第4页共8页
《Java 多线程池代码示例(可复用)》
一个内部类]</p>
* <p>Description: [定义线程池中的线程,这些线程对象用来运行任务对象
(Runnables)]</p>
* <p>Copyright: 基准版 (c) 2013</p>
{
//如果线程池的状态isAlive==false值
if (!isAlive)
{
return null; //那么返回null值
}
wait();//否则等待任务出现(添加任务)
}
//否则任务队列中的一个任务对象
return (Runnable) taskQueue.removeFirst();
}
/**
System.out.println("测试ThreadPool(线程池)任务."); System.out.println("使用方法: java ThreadPoolTest 任务数、线程 数"); System.out.println("任务数-integer:表示需要执行的任务数量."); System.out.println("线程数-integer:表示在线程池中的线程的数量 "); //return; } //读取命令行参数任务数值和线程数值 int numTasks = 2;//Integer.parseInt(args[0]); //任务数量 int numThreads = 5;//Integer.parseInt(args[1]); //线程的数量 //创建线程池对象 ThreadPool threadPool = new ThreadPool(numThreads); //执行示例任务 for (int i = 0; i < numTasks; i++) { threadPool.runTask(createTask(i)); } //关闭线程池以等待所有线程完毕 threadPool.join(); }
[开发者姓名][xgood68@]
* @update:
[日期YYYY-MM-DD][更改人姓名][E-mail]
第6页共8页
《Java 多线程池代码示例(可复用)》
*/ public static void main(String[] args) {
if (args.length != 2) {
{
new PooledThread().start();//启动池中的线程
}
}
/**
* Created on
2013-12-11
* <p>Description: [请求一个新的任务来运行,该方法立即返回。
*
然后任务在下一下空闲的线程中执行。
*
该方法是线程安全的(任务开始执行时有序的到达时开始,
*
如果本ThreadPool关闭了,那么抛出
《Java 多线程池代码示例(可复用)》
本人调试时候的运行环境:JDK版本:jdk-6u45-windows-i586;Eclipse3.6.2
一、工具类
import java.util.LinkedList;
/**
* Created on
2013-12-11
* <p>Title:
项目名称_[公共类]_[一个线程池是一组有限数量的线程,它们被用
//然后把任务队列清空 taskQueue.clear(); //最后终止线程池中所有线程的运行 interrupt(); } }
/**
* Created on
2013-12-11
* <p>Description: [关闭该ThreadPool活动,然后等待所有的线程运行完成。这
样所有等待的任务会被执行。]</p>
* @update:
[日期YYYY-MM-DD][更改人姓名][E-mail]
*/
public synchronized void close()
{
//如果线程池是活的
if (isAlive)
{
//那么置为false
isAlive = false;
第3页共8页
《Java 多线程池代码示例(可复用)》
来完成执行任务]</p>
* <p>Description: [线程池使用ThreadGroup API来实现.线程组表示一个线程的集合。
此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,
除了初始线程组外,每个线程组都有一个父线程组。允许线程访问
有关自己的线程组的信息,但是不允许它访问有关其线程组的父线
[开发者姓名][xgood68@]
* @update:
[日期YYYY-MM-DD][更改人姓名][E-mail]
*/
protected synchronized Runnable getTask() throws
相关主题