线程池的原理 精简了一下便于大家理解
来源:互联网 发布:软件界面图标 编辑:程序博客网 时间:2024/06/05 10:14
public class threadPool {
//线程池中默认的个数
private static int worker_num=5;
//工作线程
private workThread[] workThrads;
//任务队列 作为一个缓冲 ,list线程不安全
private List<Runnable> taskQueue=new LinkedList<Runnable>();
//未处理的任务
private static volatile int finished_task=0;
private static threadPool threadPool;
//单台模式获得一个指定线程个数的线程池,
private static threadPool gettThreadPool(int worker_num1) {
if(worker_num1<=0)
worker_num1=threadPool.worker_num;
if(threadPool==null)
threadPool=new threadPool(worker_num1);
return threadPool;
}
//创建线程池
public threadPool(int worker_num) {
threadPool.worker_num=worker_num;
workThrads=new workThread[worker_num];
for(int i=0;i<worker_num;i++){
workThrads[i]=new workThread();
workThrads[i].start();
}
}
//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(Runnable[] task){
synchronized(taskQueue){
for(Runnable t: task)
taskQueue.add(t);
taskQueue.notify();
}
}
//内部类,工作线程
private class workThread extends Thread{
private boolean isRunning=true;
public void run(){
Runnable r=null;
while(isRunning){
synchronized(taskQueue){
while(isRunning&&taskQueue.isEmpty()){
try {
taskQueue.wait(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(!taskQueue.isEmpty())
r=taskQueue.remove(0);//取出任务
}
if(r!=null){
r.run();
}
finished_task++;
r=null;
}
}
//停止工作,让线程自然执行run方法自然结束
public void stopWorker(){
isRunning=false;
}
}
//销毁线程池
public void destroy(){
while(!taskQueue.isEmpty()){// 如果还有任务没执行完成,就先睡会吧
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//工作线程停止工作,且置为null
for(int i=0;i<worker_num;i++){
workThrads[i].stopWorker();
workThrads[i]=null;
}
threadPool=null;
taskQueue.clear();// 清空任务队列
}
static class Task implements Runnable{
private static volatile int i=1;
public void run(){
System.out.println("任务"+(i++)+"完成");
}
}
public static void main(String[] args) {
threadPool t = threadPool.gettThreadPool(3);
t.execute(new Runnable[]{new Task(),new Task(),new Task()});
t.execute(new Runnable[]{new Task(),new Task(),new Task()});
System.out.println(t);
t.destroy();
System.out.println(t);
}
public String toString(){
return "工作线程数量:"+worker_num+"完成任务数量:"+finished_task+"等待任务数量:"+taskQueue.size();
}
/*private threadPool(){
this(5);
}*/
/*//单态模式
public static threadPool gettThreadPool(){
return gettThreadPool(threadPool.worker_num);
}*/
/* //执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(Runnable task){
synchronized(taskQueue){
taskQueue.add(task);
taskQueue.notify();
}
}*/
/*//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(List<Runnable> task){
synchronized(taskQueue){
for(Runnable t: task)
taskQueue.add(t);
taskQueue.notify();
}
}*/
// 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁
/*// 返回工作线程的个数
public int getWorkThreadNumber(){
return worker_num;
}
// 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完成
public int getFinishedTaskumber(){
return finished_task;
}
// 返回任务队列的长度,即还没处理的任务个数
public int getWaitTasknumber(){
return taskQueue.size();
}*/
}
//线程池中默认的个数
private static int worker_num=5;
//工作线程
private workThread[] workThrads;
//任务队列 作为一个缓冲 ,list线程不安全
private List<Runnable> taskQueue=new LinkedList<Runnable>();
//未处理的任务
private static volatile int finished_task=0;
private static threadPool threadPool;
//单台模式获得一个指定线程个数的线程池,
private static threadPool gettThreadPool(int worker_num1) {
if(worker_num1<=0)
worker_num1=threadPool.worker_num;
if(threadPool==null)
threadPool=new threadPool(worker_num1);
return threadPool;
}
//创建线程池
public threadPool(int worker_num) {
threadPool.worker_num=worker_num;
workThrads=new workThread[worker_num];
for(int i=0;i<worker_num;i++){
workThrads[i]=new workThread();
workThrads[i].start();
}
}
//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(Runnable[] task){
synchronized(taskQueue){
for(Runnable t: task)
taskQueue.add(t);
taskQueue.notify();
}
}
//内部类,工作线程
private class workThread extends Thread{
private boolean isRunning=true;
public void run(){
Runnable r=null;
while(isRunning){
synchronized(taskQueue){
while(isRunning&&taskQueue.isEmpty()){
try {
taskQueue.wait(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(!taskQueue.isEmpty())
r=taskQueue.remove(0);//取出任务
}
if(r!=null){
r.run();
}
finished_task++;
r=null;
}
}
//停止工作,让线程自然执行run方法自然结束
public void stopWorker(){
isRunning=false;
}
}
//销毁线程池
public void destroy(){
while(!taskQueue.isEmpty()){// 如果还有任务没执行完成,就先睡会吧
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//工作线程停止工作,且置为null
for(int i=0;i<worker_num;i++){
workThrads[i].stopWorker();
workThrads[i]=null;
}
threadPool=null;
taskQueue.clear();// 清空任务队列
}
static class Task implements Runnable{
private static volatile int i=1;
public void run(){
System.out.println("任务"+(i++)+"完成");
}
}
public static void main(String[] args) {
threadPool t = threadPool.gettThreadPool(3);
t.execute(new Runnable[]{new Task(),new Task(),new Task()});
t.execute(new Runnable[]{new Task(),new Task(),new Task()});
System.out.println(t);
t.destroy();
System.out.println(t);
}
public String toString(){
return "工作线程数量:"+worker_num+"完成任务数量:"+finished_task+"等待任务数量:"+taskQueue.size();
}
/*private threadPool(){
this(5);
}*/
/*//单态模式
public static threadPool gettThreadPool(){
return gettThreadPool(threadPool.worker_num);
}*/
/* //执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(Runnable task){
synchronized(taskQueue){
taskQueue.add(task);
taskQueue.notify();
}
}*/
/*//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器决定
public void execute(List<Runnable> task){
synchronized(taskQueue){
for(Runnable t: task)
taskQueue.add(t);
taskQueue.notify();
}
}*/
// 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁
/*// 返回工作线程的个数
public int getWorkThreadNumber(){
return worker_num;
}
// 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完成
public int getFinishedTaskumber(){
return finished_task;
}
// 返回任务队列的长度,即还没处理的任务个数
public int getWaitTasknumber(){
return taskQueue.size();
}*/
}
0 0
- 线程池的原理 精简了一下便于大家理解
- 理解线程池的原理
- 理解线程池的原理
- 理解线程池的原理
- 理解线程池的原理
- 第十三天:ArrayList的底层add方法原理,按自己理解重写了一下
- 最精简的java 线程池与任务队列,帮助理解概念
- 进程与线程一个很好的类比,大家参考一下
- 帮助大家理解一下递归函数的返回值...
- JAY的最新专集《七里香》终于出来了,大家分享一下
- 发现了JMX的好东西,大家分享一下!!
- 一张便于理解JMS的结构图
- 关于分治的小例子便于理解
- 便于理解假设检验的好例子
- 和大家探讨一下“虚拟光驱”原理
- csdn的账户是换了又换,现在决定弄个稳定的账号,便于发表些看法,大家多来支持我呀!准备多写点文章
- 开博了,大家支持一下
- 自己创业了 ,大家来支持一下
- Lintcode47 Majority Number II solution 题解
- RxJS异步通信之combineLatest和Zip
- [编程之美-04]字符串的全排列
- XML 学习小记
- FFT
- 线程池的原理 精简了一下便于大家理解
- 序列化和反序列化
- 应用程序编译安装的过程
- 汇编语言 递归子程序实现阶乘
- 指针和数组的理解
- Mapreduce实例---共同好友
- latex 算法,算法包 algorithm
- 搜索引擎之齐普夫法则
- 密码对验证