`
garyli
  • 浏览: 175823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自己写的线程池

    博客分类:
  • java
阅读更多

1 .线程池类:TPTaskProxy

 

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TPTaskProxy {
	
	private static Log log = LogFactory.getLog(TPTaskProxy.class);
		/**
		 * 添加任务并唤醒各因无任务而等待的空闲线程
		 * 
		 * @param task
		 * @throws JobException
		 */
		public void executeTask(TPTask task) {
			synchronized (taskQueue) {
				try {
					taskQueue.add(task);
					taskQueue.notifyAll();
				} catch (Exception e) {
	
				}
			}
		}
		
		public static int DEFAULT_POOL_SIZE = 10;
		
		/**
		 * 任务队列
		 */
		private Queue<TPTask> taskQueue;
		
		/**
		 * 空闲线程
		 */
		private Queue<TPTaskThread> idleThread;
		
		/**
		 * 线程池大小
		 */
		private int taskPoolSize ;
		
		public int getQueueSize(){
			return taskQueue.size();
		}
		
		public TPTaskProxy() {
			if (taskPoolSize < 0) {
				this.taskPoolSize = DEFAULT_POOL_SIZE;
			}
			taskQueue = new ConcurrentLinkedQueue<TPTask>();
			idleThread = new ConcurrentLinkedQueue<TPTaskThread>();
		}
	
		
		/**
		 * 初始化线程池,新建 N 个空闲线程
		 * 
		 */
		public void init() {
			log.debug("init");
			log.debug("taskPoolSize="+taskPoolSize);
			for (int i = 0; i < taskPoolSize; i++) {
				TPTaskThread taskThread = new TPTaskThread(this, taskQueue,"Thread " + i);
				idleThread.add(taskThread);
					taskThread.start();
			}
		}
		
		/**
		 * 关闭线程池,关闭线程池中各个线程 在调用该方法后,线程并没有马上关闭,而是在线程任务执行完之后关闭
		 * 
		 */
		public void shutDown() {
			synchronized (taskQueue) {
				for (TPTaskThread thread : idleThread) {
					thread.shutDown();
				}
			}
		}
		
		public void startAll() {
			synchronized (taskQueue) {
				for (TPTaskThread thread : idleThread) {
					thread.setBegin(true);
				}
				taskQueue.notifyAll();
			}
		}
		
		public void stopAll() {
			synchronized (taskQueue) {
				for (TPTaskThread thread : idleThread) {
					thread.setBegin(false);
				}
			}
		}
		

		/**
		 * 获取空闲线程,当线程池内无空闲线程时等待
		 * 
		 * @return
		 * @throws JobException
		 */
		public TPTaskThread getIdleThread(){
			if (idleThread.isEmpty()) {
				try {
					idleThread.wait();
				} catch (InterruptedException e) {
					 
				}
			}
			synchronized (idleThread) {
				return idleThread.poll();
			}
		}

		/**
		 * 释放线程
		 * 
		 * @param thread
		 */
		public void releaseThread(TPTaskThread thread) {
			synchronized (idleThread) {
				idleThread.add(thread);
				idleThread.notifyAll();
			}
		}

		public void setTaskPoolSize(int taskPoolSize) {
			this.taskPoolSize = taskPoolSize;
		}
}

 

 

2 .线程实现类:TPTaskThread

import java.util.Queue;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TPTaskThread extends Thread{
	
	private static  Log log = LogFactory.getLog(TPTaskThread.class);
	/**  
     * 线程关闭的标识位  
     */  
    private boolean shutDown = false; 
    private boolean begin = true;
    /**  
     * 任务队列  
     */  
    private Queue<TPTask> taskQueue; 
    
    private TPTaskProxy persistentProxy;
    
	public TPTaskThread(TPTaskProxy persistentProxy,
			Queue<TPTask> taskQueue, String name) {
		super(name);   
		log.debug("make "+this);
		System.out.println("make :::"+this);
		this.taskQueue = taskQueue;
		this.persistentProxy = persistentProxy;
	}

	public void shutDown() {
		this.shutDown = true;   
	}
	
	public void setBegin(boolean begin){
		this.begin = begin;
	}
	
    public void run() {   
        while(!shutDown) {   
            TPTask task;   
            // 如果任务队列不为空,则取出一个任务并开始执行,否则线程等等   
            if(!taskQueue.isEmpty() && begin) {
                synchronized(taskQueue) {   
                    task = taskQueue.poll();  
                } 
                //多线程抢task,如果没有抢到,直接release.
                if(task!=null)
                task.doTask();
                // 任务执行完毕之后释放线程到空闲线程队列中   
                persistentProxy.releaseThread(this);   
            } else {   
                try {   
                    synchronized(taskQueue) {
                        taskQueue.wait();   
                    }   
                } catch (InterruptedException e) {
                    
                }   
            }   
        }   
    }   

}

 

3 .要执行的任务类:TPTask

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TPTask {
	
	private Object target;
	private String methodName;
	private Object[] params;
	private Class<?>[] types;
	
	public TPTask(Object target,String methodName,Object[] params,Class<?>[] types){
		this.target = target;
		this.methodName = methodName;
		this.params = params;
		this.types = types;
	}
	
	public void doTask(){
		try {
			Method method = null;
			if(params.length > 0)
				method = target.getClass().getMethod(methodName, types);
			else 
				method = target.getClass().getMethod(methodName);
			
			method.invoke(target, params);
		} 
		catch (SecurityException e) {
			e.printStackTrace();
		} 
		catch (NoSuchMethodException e) {
			e.printStackTrace();
		} 
		catch (IllegalArgumentException e) {
			e.printStackTrace();
		} 
		catch (IllegalAccessException e) {
			e.printStackTrace();
		} 
		catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

}

 

使用:

TPTaskProxy proxy = new TPTaskProxy();
//设置线程池的大小
int poolSize = 100;
proxy.setTaskPoolSize(poolSize);
proxy.init();
//目标对象,可以是任何类型对象
TargetObject target = new TargetObject();
proxy.executeTask(new TPTask(target,"methodName",
	new Object[]{agr1,	arg2,}
	,new Class<?>[]{arg1.class,arg2.class}));

 

分享到:
评论

相关推荐

    自己写的java线程池,学习用,望指点

    NULL 博文链接:https://wentry.iteye.com/blog/1873521

    自己写的C#线程池

    从易语言转型到C#感觉C#自带的线程池不够灵活(或许是自己的技术不够),所以自己写了一个线程池工作类为了配合自己的使用习惯,有兴趣的可以下载参考 代码用到的是信号处理以及队列等一些比较基础的东西,已经测试了功能...

    自己写的线程池代码

    自己写的线程池代码,win32程序,可以运行,有注释;简单易懂。

    德国人写的 线程池代码 for DelphiXE

    Examples 文件夹中可能包含了使用线程池的示例代码,这些示例有助于开发者理解和学习如何在自己的项目中应用线程池。通过查看这些例子,我们可以了解如何提交任务到线程池,如何等待所有任务完成,以及如何处理...

    标准C写的线程池和读写锁

    在IT领域,线程池和读写锁是两种重要的多线程编程技术,尤其是在Linux操作系统中。本项目提供了一个标准C语言实现的线程池,...开发者可以通过深入研究这些源代码,更好地理解和掌握多线程编程的精髓,提升自己的技能。

    VC写的一个简单的线程池

    虽然VC标准库并不直接提供线程池的实现,但Windows API提供了`CreateThreadPool()`和`SubmitWorkItem()`等功能,可以用于构建线程池,但使用起来较为复杂,通常需要自己实现线程池的管理逻辑。 通过上述知识点,...

    vc写的一个线程池操作的类

    这意味着开发者可以下载这个压缩包,导入到自己的项目中,然后通过实例化和调用类的方法来创建和管理线程池,执行并发任务。 压缩包中的"VC写的一个简单的线程池"可能是源代码文件,包含了实现上述功能的类和函数。...

    Visual C++写的线程池的例子threadmanage.rar

    线程池是一种多线程处理形式,通过维护一组可重用线程来高效地执行并发任务。在"Visual C++写的线程池的例子...通过阅读和分析这些源代码,开发者可以深入理解线程池的工作机制,并将其应用到自己的项目中。

    C++写的线程池,环境是ubuntu(Linux)

    在"C++写的线程池,环境是ubuntu(Linux)"这个项目中,我们可以深入探讨以下几个核心知识点: 1. **C++线程库**:C++11及更高版本引入了`&lt;thread&gt;`库,提供了对多线程编程的支持。在Ubuntu这样的Linux环境中,C++...

    实现线程池.rar

    3. **线程函数**:每个线程都有自己的执行函数,它会不断地从工作队列中取出任务进行处理。当队列为空时,线程可能会进入休眠状态,等待新任务的到来。这种机制可以避免无谓的CPU资源浪费。 4. **任务提交**:用户...

    Linux下C线程池实现

    在Linux下用C写的一个简易线程池。系统是RedHat 9,gcc版本"gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)"。文件夹里的源码是按工程组织好的,在文件夹下的test目录下面有一个小的测试程序和Makefile,编译后即可...

    用c写的一个关于线程池的代码

    - **线程**: 在操作系统中,线程是程序执行的最小单位,每个线程都有自己的程序计数器、系统寄存器和堆栈。 - **线程池**: 是一组预先创建并管理的线程集合,任务提交者将待处理的任务放入队列,线程池中的空闲...

    线程池拷贝显示树状图.zip

    在IT领域,线程池是一种优化资源管理...开发者可以通过这个项目深入理解并掌握这些技术,提高自己的编程技能。在实际开发中,这样的工具对于处理大量文件的拷贝任务尤其有用,能够提供直观的进度反馈和高效的执行策略。

    线程池实现原理

    瞎写的线程池原理,没啥用,只是留着自己以后想看看,在技术博客中都有.不要下载,乱七八糟的,怕你们吐槽.

    C#自定义线程池

    自定义的线程池类,自己写的一个组件,用起来还是挺方便的。我已经用在了好几个项目上。 资源中包括一个DLL文件和一个XML文件,XML文件是方法和属性的一个注释文档,将其和DLL放置同一个目录下后,引用DLL后,使用...

    Delphi7 线程池 sThreadPool

    使用别人的东西,始终不习惯,看别人的代码也是一头雾水,于是参考他人的功能,用 Delphi7 写了一个适合自己的线程池 。由于没有好的办法获取到 CPU 的使用率,自动调整线程数的功能就不做了。 除了常用的功能,对...

    java 断点续传 多线程下载 线程池下载

    由于要写一个从第三方服务器拉取文件的插件,百度了很多都 不是很满意,所以自己写了一个,废话少说,看代码,欢迎拍板 断点续传,多线程下载文件,idea开发工具需要安装 lombok 插件,具体百度下吧, 不过没有也没...

    Consoletransport.rar_c 端口转发_port forwarding_端口 转发_线程池_转发

    端口转发,用线程池技术,自己写的,可以参考

    C语言+epoll+线程池实现的聊天室.zip

    在本项目"C语言+epoll+线程池实现的聊天室"中,开发者采用了一种高效并发处理模型来构建一个实时交互的聊天平台。...通过对源码的分析,我们可以深入理解epoll和线程池在实际应用中的作用,提升自己的系统编程能力。

    多线程操作源码 锁和线程池 非IOCP

    在操作系统中,线程是程序执行的最小单位,每个线程都有自己独立的运行栈,共享进程的内存空间。创建多线程可以使得程序并行处理多个任务,比如在用户界面更新的同时进行后台计算。然而,多线程也带来了同步和竞态...

Global site tag (gtag.js) - Google Analytics